Go to the documentation of this file.00001 #region License
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #endregion
00022
00023 using System.Collections;
00024 using System.Collections.Generic;
00025 using System.Web.UI;
00026
00027 namespace N2.Collections
00028 {
00033 public class ItemList<T> : IList<T>, IHierarchicalEnumerable where T : ContentItem
00034 {
00035 IList<T> inner;
00036
00037 #region Constructors
00038
00040 public ItemList()
00041 {
00042 inner = new List<T>();
00043 }
00044
00046 public ItemList(IList<T> items)
00047 {
00048 inner = items ?? new List<T>();
00049 }
00050
00052 public ItemList(IEnumerable<T> items)
00053 {
00054 inner = new List<T>(items);
00055 }
00056
00060 public ItemList(IEnumerable items, params ItemFilter[] filters)
00061 : this()
00062 {
00063 AddRange(items, filters);
00064 }
00065
00069 public ItemList(ICollection<T> items, ItemFilter filter)
00070 : this()
00071 {
00072 if (items.Count == 0)
00073 return;
00074 AddRange(items, filter);
00075 }
00076
00077 #endregion
00078
00079 #region Methods
00080
00081 public void AddRange(IEnumerable<T> items, params ItemFilter[] filters)
00082 {
00083 foreach (T item in items)
00084 if (AllMatch(item, filters))
00085 Add(item);
00086 }
00087
00088 public void AddRange(IEnumerable items, params ItemFilter[] filters)
00089 {
00090 foreach (ContentItem item in items)
00091 if (AllMatch(item, filters))
00092 Add((T) item);
00093 }
00094
00095 public void AddRange(IEnumerable<T> items, IEnumerable<ItemFilter> filters)
00096 {
00097 foreach (T item in items)
00098 if (AllMatch(item, filters))
00099 Add(item);
00100 }
00101
00102 private bool AllMatch(ContentItem item, IEnumerable<ItemFilter> filters)
00103 {
00104 foreach (ItemFilter filter in filters)
00105 if (!filter.Match(item))
00106 return false;
00107 return true;
00108 }
00109
00111 public void Sort()
00112 {
00113 List<T> copy = new List<T>(inner);
00114 copy.Sort();
00115 inner = copy;
00116 }
00117
00120 public void Sort(IComparer<T> comparer)
00121 {
00122 List<T> copy = new List<T>(inner);
00123 copy.Sort(comparer);
00124 inner = copy;
00125 }
00126
00129 public void Sort(string sortExpression)
00130 {
00131 Sort(new ItemComparer<T>(sortExpression));
00132 }
00133
00134 public bool ContainsAny(IEnumerable<T> items)
00135 {
00136 foreach (T item in items)
00137 if (Contains(item))
00138 return true;
00139 return false;
00140 }
00141
00145 public ItemList<OtherT> Cast<OtherT>() where OtherT : ContentItem
00146 {
00147 return new ItemList<OtherT>(this, TypeFilter.Of<OtherT>());
00148 }
00149 #endregion
00150
00151 #region IHierarchicalEnumerable Members
00152
00153 public IHierarchyData GetHierarchyData(object enumeratedItem)
00154 {
00155 return new ItemHierarchyData((ContentItem) enumeratedItem);
00156 }
00157
00158 #endregion
00159
00160 #region Nested type: ItemHierarchyData
00161
00162 private class ItemHierarchyData : IHierarchyData
00163 {
00164 private ContentItem item;
00165
00166 public ItemHierarchyData(ContentItem item)
00167 {
00168 this.item = item;
00169 }
00170
00171 #region IHierarchyData Members
00172
00173 IHierarchicalEnumerable IHierarchyData.GetChildren()
00174 {
00175 return item.GetChildren();
00176 }
00177
00178 IHierarchyData IHierarchyData.GetParent()
00179 {
00180 return (item.Parent != null)
00181 ? new ItemHierarchyData(item.Parent)
00182 : null;
00183 }
00184
00185 bool IHierarchyData.HasChildren
00186 {
00187 get { return item.GetChildren().Count > 0; }
00188 }
00189
00190 object IHierarchyData.Item
00191 {
00192 get { return item; }
00193 }
00194
00195 string IHierarchyData.Path
00196 {
00197 get { return item.Url; }
00198 }
00199
00200 string IHierarchyData.Type
00201 {
00202 get { return item.GetContentType().Name; }
00203 }
00204
00205 #endregion
00206 }
00207
00208 #endregion
00209
00210 #region IList<T> Members
00211
00212 public int IndexOf(T item)
00213 {
00214 return inner.IndexOf(item);
00215 }
00216
00217 public void Insert(int index, T item)
00218 {
00219 inner.Insert(index, item);
00220 }
00221
00222 public void RemoveAt(int index)
00223 {
00224 inner.RemoveAt(index);
00225 }
00226
00227 public T this[int index]
00228 {
00229 get { return inner[index]; }
00230 set { inner[index] = value; }
00231 }
00232
00233 #endregion
00234
00235 #region ICollection<T> Members
00236
00237 public void Add(T item)
00238 {
00239 inner.Add(item);
00240 }
00241
00242 public void Clear()
00243 {
00244 inner.Clear();
00245 }
00246
00247 public bool Contains(T item)
00248 {
00249 return inner.Contains(item);
00250 }
00251
00252 public void CopyTo(T[] array, int arrayIndex)
00253 {
00254 inner.CopyTo(array, arrayIndex);
00255 }
00256
00257 public int Count
00258 {
00259 get { return inner.Count; }
00260 }
00261
00262 public bool IsReadOnly
00263 {
00264 get { return inner.IsReadOnly; }
00265 }
00266
00267 public bool Remove(T item)
00268 {
00269 return inner.Remove(item);
00270 }
00271
00272 #endregion
00273
00274 #region IEnumerable<T> Members
00275
00276 public IEnumerator<T> GetEnumerator()
00277 {
00278 return inner.GetEnumerator();
00279 }
00280
00281 #endregion
00282
00283 #region IEnumerable Members
00284
00285 IEnumerator IEnumerable.GetEnumerator()
00286 {
00287 return inner.GetEnumerator();
00288 }
00289
00290 #endregion
00291 }
00292 }