RaUI/Source/ryControls/Sheng.Winform.Controls/ShengListView/ShengListViewItemCollection.cs

311 lines
8.3 KiB
C#
Raw Normal View History

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
namespace Sheng.Winform.Controls
{
public class ShengListViewItemCollection : CollectionBase, IList<ShengListViewItem>
{
#region
public ShengListViewItemCollection()
{
}
public ShengListViewItemCollection(ShengListViewItemCollection value)
{
this.AddRange(value);
}
public ShengListViewItemCollection(ShengListViewItem[] value)
{
this.AddRange(value);
}
public ShengListViewItem this[int index]
{
get
{
return ((ShengListViewItem)(List[index]));
}
set
{
List[index] = value;
}
}
public int Add(ShengListViewItem value)
{
value.OwnerCollection = this;
int index = List.Add(value);
_owner.Refresh();
return index;
}
public void AddRange(ShengListViewItem[] value)
{
_owner.SuspendLayout();
for (int i = 0; (i < value.Length); i = (i + 1))
{
this.Add(value[i]);
}
_owner.ResumeLayout(true);
}
public void AddRange(ShengListViewItemCollection value)
{
_owner.SuspendLayout();
for (int i = 0; (i < value.Count); i = (i + 1))
{
this.Add(value[i]);
}
_owner.ResumeLayout(true);
}
public bool Contains(ShengListViewItem value)
{
return List.Contains(value);
}
public void CopyTo(ShengListViewItem[] array, int index)
{
List.CopyTo(array, index);
}
public int IndexOf(ShengListViewItem value)
{
return List.IndexOf(value);
}
public void Insert(int index, ShengListViewItem value)
{
value.OwnerCollection = this;
List.Insert(index, value);
}
public void Remove(ShengListViewItem value)
{
value.OwnerCollection = null;
List.Remove(value);
_owner.Refresh();
_owner.OnItemsRemoved(new List<ShengListViewItem>() { value });
}
public void Remove(List<ShengListViewItem> items)
{
_owner.SuspendLayout();
foreach (var item in items)
{
item.OwnerCollection = null;
List.Remove(item);
}
_owner.ResumeLayout(true);
_owner.OnItemsRemoved(items);
}
protected override void OnClear()
{
_owner.SuspendLayout();
base.OnClear();
_owner.ResumeLayout(true);
}
#endregion
#region
private ShengListView _owner;
internal ShengListView Owner
{
get { return _owner; }
set { _owner = value; }
}
public ShengListViewItem[] ToArray()
{
return this.ToList().ToArray();
}
public List<ShengListViewItem> ToList()
{
List<ShengListViewItem> list = new List<ShengListViewItem>();
foreach (ShengListViewItem e in this)
{
list.Add(e);
}
return list;
}
/// <summary>
/// 将指定的事件移动到(紧邻)另一个事件之前
/// </summary>
/// <param name="targetEvent"></param>
/// <param name="referEvent"></param>
public void PreTo(ShengListViewItem targetEvent, ShengListViewItem referEvent)
{
if (targetEvent == null || referEvent == null)
return;
if (this.Contains(targetEvent) == false || this.Contains(referEvent) == false)
return;
//这里不能因为目标事件是最顶过就直接返回
//因为此方法的目的是把目标事件放在指定事件 紧挨着 的 前面 一个,而不是前面的任意位置
//有可能目标事件index是0指定事件是3那么此方法要把目标事件的index变为2
//如果指定事件已经是最顶个了,直接返回
//int targetIndex = this.IndexOf(targetEvent);
//if (targetIndex == 0)
// return;
int referIndex = this.IndexOf(referEvent);
//如果目标事件在指定事件之前的某个位置这里不能先直接remove目标事件
//因为这样会使指定事件提前一个index此时在referIndex上insert就跑到指定事件后面去了
//如果目标事件本身在指定事件之后,则无此问题
//先判断如果在前,就 referIndex--再insert
if (this.IndexOf(targetEvent) < referIndex)
referIndex--;
this.Remove(targetEvent);
this.Insert(referIndex, targetEvent);
}
/// <summary>
/// 将指定的事件移动到(紧邻)另一个事件之后
/// </summary>
/// <param name="targetEvent"></param>
/// <param name="referEvent"></param>
public void NextTo(ShengListViewItem targetEvent, ShengListViewItem referEvent)
{
if (targetEvent == null || referEvent == null)
return;
if (this.Contains(targetEvent) == false || this.Contains(referEvent) == false)
return;
//如果指定事件已经是最后个了,直接返回
//int targetIndex = this.IndexOf(targetEvent);
//if (targetIndex == this.Count - 1)
// return;
int referIndex = this.IndexOf(referEvent);
//这里在remove之前也要先判断目标事件是在指定事件之前还是之后
//如果在指定事件之后那么referIndex++,不然就insert到指定事件前面了
if (this.IndexOf(targetEvent) > referIndex)
referIndex++;
this.Remove(targetEvent);
this.Insert(referIndex, targetEvent);
}
#endregion
#region ImageListViewItemEnumerator
[Serializable]
public class ImageListViewItemEnumerator : object, IEnumerator, IEnumerator<ShengListViewItem>
{
private IEnumerator baseEnumerator;
private IEnumerable temp;
public ImageListViewItemEnumerator(ShengListViewItemCollection mappings)
{
this.temp = ((IEnumerable)(mappings));
this.baseEnumerator = temp.GetEnumerator();
}
public ShengListViewItem Current
{
get
{
return ((ShengListViewItem)(baseEnumerator.Current));
}
}
object IEnumerator.Current
{
get
{
return baseEnumerator.Current;
}
}
public bool MoveNext()
{
return baseEnumerator.MoveNext();
}
bool IEnumerator.MoveNext()
{
return baseEnumerator.MoveNext();
}
public void Reset()
{
baseEnumerator.Reset();
}
void IEnumerator.Reset()
{
baseEnumerator.Reset();
}
#region IDisposable
public void Dispose()
{
}
#endregion
}
#endregion
#region ICollection<ImageListViewItem>
void ICollection<ShengListViewItem>.Add(ShengListViewItem item)
{
this.Add(item);
}
public bool IsReadOnly
{
get { return false; }
}
bool ICollection<ShengListViewItem>.Remove(ShengListViewItem item)
{
this.Remove(item);
return true;
}
#endregion
#region IEnumerable<ImageListViewItem>
public new IEnumerator<ShengListViewItem> GetEnumerator()
{
return new ImageListViewItemEnumerator(this);
}
#endregion
}
}