1 //------------------------------------------------------------------------------
2 // <copyright file="SiteMapNodeCollection.cs" company="Microsoft">
3 // Copyright (c) Microsoft Corporation. All rights reserved.
5 //------------------------------------------------------------------------------
8 * Copyright (c) 2002 Microsoft Corporation
11 namespace System.Web {
14 using System.Collections;
15 using System.Diagnostics;
16 using System.Security.Permissions;
18 using System.Web.UI.WebControls;
20 public class SiteMapNodeCollection : IHierarchicalEnumerable, IList {
22 internal static SiteMapNodeCollection Empty = new ReadOnlySiteMapNodeCollection(new SiteMapNodeCollection());
23 private int _initialSize = 10;
24 private ArrayList _innerList;
27 public SiteMapNodeCollection() {
30 // Create the collection with initial capacity.
31 public SiteMapNodeCollection(int capacity) {
32 _initialSize = capacity;
35 public SiteMapNodeCollection(SiteMapNode value) {
37 throw new ArgumentNullException("value");
45 public SiteMapNodeCollection(SiteMapNode[] value) {
47 throw new ArgumentNullException("value");
50 _initialSize = value.Length;
51 AddRangeInternal(value);
55 public SiteMapNodeCollection(SiteMapNodeCollection value) {
57 throw new ArgumentNullException("value");
60 _initialSize = value.Count;
61 AddRangeInternal(value);
64 public virtual int Count {
70 public virtual bool IsSynchronized {
72 return List.IsSynchronized;
76 public virtual object SyncRoot {
82 private ArrayList List {
84 Debug.Assert(!(this is ReadOnlySiteMapNodeCollection), "List should not be called on ReadOnlySiteMapNodeCollection.");
86 if (_innerList == null) {
87 _innerList = new ArrayList(_initialSize);
95 public virtual bool IsFixedSize {
100 public virtual bool IsReadOnly {
101 get { return false; }
105 public virtual SiteMapNode this[int index] {
107 return (SiteMapNode)List[index];
111 throw new ArgumentNullException("value");
118 public virtual int Add(SiteMapNode value) {
120 throw new ArgumentNullException("value");
122 return List.Add(value);
126 public virtual void AddRange(SiteMapNode[] value) {
127 AddRangeInternal(value);
131 public virtual void AddRange(SiteMapNodeCollection value) {
132 AddRangeInternal(value);
135 private void AddRangeInternal(IList value) {
137 throw new ArgumentNullException("value");
140 List.AddRange(value);
143 public virtual void Clear() {
147 public virtual bool Contains(SiteMapNode value) {
148 return List.Contains(value);
152 public virtual void CopyTo(SiteMapNode[] array, int index) {
153 CopyToInternal(array, index);
156 internal virtual void CopyToInternal(Array array, int index) {
157 List.CopyTo(array, index);
160 public SiteMapDataSourceView GetDataSourceView(SiteMapDataSource owner, string viewName) {
161 return new SiteMapDataSourceView(owner, viewName, this);
164 public virtual IEnumerator GetEnumerator() {
165 return List.GetEnumerator();
169 public SiteMapHierarchicalDataSourceView GetHierarchicalDataSourceView() {
170 return new SiteMapHierarchicalDataSourceView(this);
174 public virtual IHierarchyData GetHierarchyData(object enumeratedItem) {
175 return enumeratedItem as IHierarchyData;
179 public virtual int IndexOf(SiteMapNode value) {
180 return List.IndexOf(value);
184 public virtual void Insert(int index, SiteMapNode value) {
186 throw new ArgumentNullException("value");
189 List.Insert(index, value);
193 protected virtual void OnValidate(object value) {
195 throw new ArgumentNullException("value");
198 if (!(value is SiteMapNode)) {
199 throw new ArgumentException(
200 SR.GetString(SR.SiteMapNodeCollection_Invalid_Type, value.GetType().ToString()));
205 public static SiteMapNodeCollection ReadOnly(SiteMapNodeCollection collection) {
206 if (collection == null) {
207 throw new ArgumentNullException("collection");
210 return new ReadOnlySiteMapNodeCollection(collection);
214 public virtual void Remove(SiteMapNode value) {
216 throw new ArgumentNullException("value");
222 public virtual void RemoveAt(int index) {
223 List.RemoveAt(index);
226 #region ICollection implementation
227 int ICollection.Count {
233 bool ICollection.IsSynchronized {
235 return IsSynchronized;
239 object ICollection.SyncRoot {
245 void ICollection.CopyTo(Array array, int index) {
246 CopyToInternal(array, index);
250 #region IEnumerable implementation
251 IEnumerator IEnumerable.GetEnumerator() {
252 return GetEnumerator();
256 #region IHierarchicalEnumerable implementation
259 IHierarchyData IHierarchicalEnumerable.GetHierarchyData(object enumeratedItem) {
260 return GetHierarchyData(enumeratedItem);
264 #region IList implementation
266 bool IList.IsFixedSize {
267 get { return IsFixedSize; }
271 bool IList.IsReadOnly {
272 get { return IsReadOnly; }
277 object IList.this[int index] {
283 this[index] = (SiteMapNode)value;
287 int IList.Add(object value) {
289 return Add((SiteMapNode)value);
296 bool IList.Contains(object value) {
298 return Contains((SiteMapNode)value);
301 int IList.IndexOf(object value) {
303 return IndexOf((SiteMapNode)value);
306 void IList.Insert(int index, object value) {
308 Insert(index, (SiteMapNode)value);
311 void IList.Remove(object value) {
313 Remove((SiteMapNode)value);
316 void IList.RemoveAt(int index) {
321 private sealed class ReadOnlySiteMapNodeCollection : SiteMapNodeCollection {
322 private SiteMapNodeCollection _internalCollection;
324 internal ReadOnlySiteMapNodeCollection(SiteMapNodeCollection collection) {
325 if (collection == null) {
326 throw new ArgumentNullException("collection");
329 _internalCollection = collection;
332 public override int Count {
334 return _internalCollection.Count;
338 public override bool IsFixedSize {
342 public override bool IsReadOnly {
346 public override bool IsSynchronized {
348 return _internalCollection.IsSynchronized;
352 public override object SyncRoot {
354 return _internalCollection.SyncRoot;
359 public override int Add(SiteMapNode value) {
360 throw new NotSupportedException(SR.GetString(SR.Collection_readonly));
364 public override void AddRange(SiteMapNode[] value) {
365 throw new NotSupportedException(SR.GetString(SR.Collection_readonly));
369 public override void AddRange(SiteMapNodeCollection value) {
370 throw new NotSupportedException(SR.GetString(SR.Collection_readonly));
373 public override void Clear() {
374 throw new NotSupportedException(SR.GetString(SR.Collection_readonly));
377 public override bool Contains(SiteMapNode node) {
378 return _internalCollection.Contains(node);
381 internal override void CopyToInternal(Array array, int index) {
382 _internalCollection.List.CopyTo(array, index);
385 public override SiteMapNode this[int index] {
387 return _internalCollection[index];
390 throw new NotSupportedException(SR.GetString(SR.Collection_readonly));
394 public override IEnumerator GetEnumerator() {
395 return _internalCollection.GetEnumerator();
398 public override int IndexOf(SiteMapNode value) {
399 return _internalCollection.IndexOf(value);
402 public override void Insert(int index, SiteMapNode value) {
403 throw new NotSupportedException(SR.GetString(SR.Collection_readonly));
406 public override void Remove(SiteMapNode value) {
407 throw new NotSupportedException(SR.GetString(SR.Collection_readonly));
410 public override void RemoveAt(int index) {
411 throw new NotSupportedException(SR.GetString(SR.Collection_readonly));