You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
176 lines
4.2 KiB
C#
176 lines
4.2 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.Collections.ObjectModel;
|
|
|
|
namespace Mesnac.Docking
|
|
{
|
|
public class DockContentCollection : ReadOnlyCollection<IDockContent>
|
|
{
|
|
private static List<IDockContent> _emptyList = new List<IDockContent>(0);
|
|
|
|
internal DockContentCollection()
|
|
: base(new List<IDockContent>())
|
|
{
|
|
}
|
|
|
|
internal DockContentCollection(DockPane pane)
|
|
: base(_emptyList)
|
|
{
|
|
m_dockPane = pane;
|
|
}
|
|
|
|
private DockPane m_dockPane = null;
|
|
private DockPane DockPane
|
|
{
|
|
get { return m_dockPane; }
|
|
}
|
|
|
|
public new IDockContent this[int index]
|
|
{
|
|
get
|
|
{
|
|
if (DockPane == null)
|
|
return Items[index] as IDockContent;
|
|
else
|
|
return GetVisibleContent(index);
|
|
}
|
|
}
|
|
|
|
internal int Add(IDockContent content)
|
|
{
|
|
#if DEBUG
|
|
if (DockPane != null)
|
|
throw new InvalidOperationException();
|
|
#endif
|
|
|
|
if (Contains(content))
|
|
return IndexOf(content);
|
|
|
|
Items.Add(content);
|
|
return Count - 1;
|
|
}
|
|
|
|
internal void AddAt(IDockContent content, int index)
|
|
{
|
|
#if DEBUG
|
|
if (DockPane != null)
|
|
throw new InvalidOperationException();
|
|
#endif
|
|
|
|
if (index < 0 || index > Items.Count - 1)
|
|
return;
|
|
|
|
if (Contains(content))
|
|
return;
|
|
|
|
Items.Insert(index, content);
|
|
}
|
|
|
|
public new bool Contains(IDockContent content)
|
|
{
|
|
if (DockPane == null)
|
|
return Items.Contains(content);
|
|
else
|
|
return (GetIndexOfVisibleContents(content) != -1);
|
|
}
|
|
|
|
public new int Count
|
|
{
|
|
get
|
|
{
|
|
if (DockPane == null)
|
|
return base.Count;
|
|
else
|
|
return CountOfVisibleContents;
|
|
}
|
|
}
|
|
|
|
public new int IndexOf(IDockContent content)
|
|
{
|
|
if (DockPane == null)
|
|
{
|
|
if (!Contains(content))
|
|
return -1;
|
|
else
|
|
return Items.IndexOf(content);
|
|
}
|
|
else
|
|
return GetIndexOfVisibleContents(content);
|
|
}
|
|
|
|
internal void Remove(IDockContent content)
|
|
{
|
|
if (DockPane != null)
|
|
throw new InvalidOperationException();
|
|
|
|
if (!Contains(content))
|
|
return;
|
|
|
|
Items.Remove(content);
|
|
}
|
|
|
|
private int CountOfVisibleContents
|
|
{
|
|
get
|
|
{
|
|
#if DEBUG
|
|
if (DockPane == null)
|
|
throw new InvalidOperationException();
|
|
#endif
|
|
|
|
int count = 0;
|
|
foreach (IDockContent content in DockPane.Contents)
|
|
{
|
|
if (content.DockHandler.DockState == DockPane.DockState)
|
|
count++;
|
|
}
|
|
return count;
|
|
}
|
|
}
|
|
|
|
private IDockContent GetVisibleContent(int index)
|
|
{
|
|
#if DEBUG
|
|
if (DockPane == null)
|
|
throw new InvalidOperationException();
|
|
#endif
|
|
|
|
int currentIndex = -1;
|
|
foreach (IDockContent content in DockPane.Contents)
|
|
{
|
|
if (content.DockHandler.DockState == DockPane.DockState)
|
|
currentIndex++;
|
|
|
|
if (currentIndex == index)
|
|
return content;
|
|
}
|
|
throw (new ArgumentOutOfRangeException());
|
|
}
|
|
|
|
private int GetIndexOfVisibleContents(IDockContent content)
|
|
{
|
|
#if DEBUG
|
|
if (DockPane == null)
|
|
throw new InvalidOperationException();
|
|
#endif
|
|
|
|
if (content == null)
|
|
return -1;
|
|
|
|
int index = -1;
|
|
foreach (IDockContent c in DockPane.Contents)
|
|
{
|
|
if (c.DockHandler.DockState == DockPane.DockState)
|
|
{
|
|
index++;
|
|
|
|
if (c == content)
|
|
return index;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
}
|
|
}
|