220 lines
4.8 KiB
C#

namespace DevComponents.DotNetBar
{
using System;
using System.Collections;
/// <summary>
/// Holds reference to all unique items in the DotNetBar.
/// </summary>
public class Items:IEnumerable,IDisposable
{
private System.Collections.SortedList m_Items;
private DotNetBarManager m_Owner;
internal Items(DotNetBarManager objOwner)
{
m_Items=new System.Collections.SortedList();
m_Owner=objOwner;
}
public void Dispose()
{
this.Clear();
m_Items=null;
m_Owner=null;
}
public void Clear()
{
if(m_Owner!=null)
{
foreach(BaseItem item in m_Items.Values)
((IOwner)m_Owner).RemoveShortcutsFromItem(item);
}
m_Items.Clear();
}
public void Add(BaseItem objItem)
{
if(objItem==null)
throw new System.ArgumentNullException("Item must be valid value");
if(objItem.Name==null || objItem.Name=="")
{
// Auto assign item name
objItem.Name="item_"+objItem.Id.ToString();
}
if(m_Items.ContainsKey(objItem.Name))
{
throw new System.InvalidOperationException("Item with this name already exists");
}
if(objItem.Parent!=null)
throw new System.InvalidOperationException("Item already has a Parent. Remove item from Parent first.");
objItem.SetOwner(m_Owner);
objItem.GlobalItem=true;
m_Items.Add(objItem.Name,objItem);
}
public void AddCopy(BaseItem objItem)
{
if(objItem==null)
throw new System.ArgumentNullException("Item must be valid value");
if(objItem.Name==null || objItem.Name=="")
{
// Auto assign item name
objItem.Name="item_"+objItem.Id.ToString();
}
if(m_Items.ContainsKey(objItem.Name))
throw new System.InvalidOperationException("Item with this name already exists");
BaseItem objCopy=objItem.Copy();
objCopy.SetOwner(m_Owner);
objCopy.GlobalItem=true;
m_Items.Add(objCopy.Name,objCopy);
}
public void Remove(BaseItem objItemToRemove)
{
if(m_Items.ContainsKey(objItemToRemove.Name))
{
m_Items.Remove(objItemToRemove.Name);
objItemToRemove.SetOwner(null);
((IOwner)m_Owner).RemoveShortcutsFromItem(objItemToRemove);
//objItemToRemove.GlobalItem=false;
return;
}
string sItemName=objItemToRemove.Name;
foreach(DictionaryEntry o in m_Items)
{
BaseItem objItem=o.Value as BaseItem;
// Name out of sync case
if(objItem==objItemToRemove)
{
m_Items.RemoveAt(m_Items.IndexOfValue(objItem));
objItemToRemove.SetOwner(null);
((IOwner)m_Owner).RemoveShortcutsFromItem(objItemToRemove);
return;
}
if(objItem.SubItems.Count>0)
{
if(RemoveItem(sItemName,objItem))
{
//objItemToRemove.GlobalItem=false;
return;
}
}
}
// This will throw exception...
m_Items.Remove(objItemToRemove.Name);
objItemToRemove.SetOwner(null);
}
public void Remove(string sItemName)
{
Remove(m_Items[sItemName] as BaseItem);
}
public BaseItem this[string sItemName]
{
get
{
if(m_Items.ContainsKey(sItemName))
return m_Items[sItemName] as BaseItem;
foreach(DictionaryEntry o in m_Items)
{
BaseItem objItem=o.Value as BaseItem;
if(objItem.Name==sItemName)
return objItem;
if(objItem.SubItems.Count>0)
{
objItem=GetItem(sItemName,objItem);
if(objItem!=null)
return objItem;
}
}
throw new InvalidOperationException("Item not found in collection");
//return null;
}
}
private BaseItem GetItem(string sName, BaseItem objParent)
{
BaseItem objItem2=null;
foreach(BaseItem objItem in objParent.SubItems)
{
if(objItem.Name==sName)
return objItem;
if(objItem.SubItems.Count>0)
{
objItem2=GetItem(sName,objItem);
if(objItem2!=null)
return objItem2;
}
}
return null;
}
private bool RemoveItem(string sName, BaseItem objParent)
{
foreach(BaseItem objItem in objParent.SubItems)
{
if(objItem.Name==sName)
{
objParent.SubItems.Remove(objItem);
objItem.SetOwner(null);
((IOwner)m_Owner).RemoveShortcutsFromItem(objItem);
return true;
}
if(objItem.SubItems.Count>0)
{
if(RemoveItem(sName,objItem))
return true;
}
}
return false;
}
//public BaseItem Item(string sItemName)
//{
// return m_Items[sItemName] as BaseItem;
//}
public BaseItem this[int iIndex]
{
get
{
return m_Items.GetByIndex(iIndex) as BaseItem;
}
}
//public BaseItem Item(int iIndex)
//{
// return m_Items.GetByIndex(iIndex) as BaseItem;
//}
public int Count
{
get
{
return m_Items.Count;
}
}
public IEnumerator GetEnumerator()
{
return m_Items.GetEnumerator();
}
public bool Contains(BaseItem objItem)
{
return m_Items.ContainsValue(objItem);
}
public bool Contains(string sName)
{
return m_Items.ContainsKey(sName);
}
}
}