RaUI/Source/ryControls/WeifenLuo.WinFormsUI/Docking/DockContentCollection.cs
zilinsoft 3262955f2f ### 2023-11-07更新
------
#### RaUIV4    V4.0.2311.0701
- *.[全新]整合了MyDb、ryControls、MyDb_MySQL等dll文件到RaUI一个项目。
- *.[新增]新增ApkOp类,可以轻松获取APK信息。
- *.[新增]新增JsonExt扩展类,让Json操作更简单。
- *.[新增]新增WebP类,可以支持webp格式的图片。
- *.[改进]ryQuickSQL中的AddField方法改为自动替换已存在的同名值。
- *.[修复]ryQuickSQL中的AddFieldCalc方法无法正常计算的BUG。
2023-11-07 16:37:53 +08:00

176 lines
4.4 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
#pragma warning disable CS1591 // 缺少对公共可见类型或成员的 XML 注释
namespace WeifenLuo.WinFormsUI.Docking
{
public class DockContentCollection : ReadOnlyCollection<IDockContent>
{
private static readonly List<IDockContent> _emptyList = new List<IDockContent>(0);
internal DockContentCollection()
: base(new List<IDockContent>())
{
}
internal DockContentCollection(DockPane pane)
: base(_emptyList)
{
m_dockPane = pane;
}
private readonly 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;
}
}
}