320 lines
7.9 KiB
C#
320 lines
7.9 KiB
C#
#if FRAMEWORK20
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using DevComponents.Schedule.Model;
|
|
|
|
namespace DevComponents.DotNetBar.Schedule
|
|
{
|
|
public class ColumnList
|
|
{
|
|
#region Private variables
|
|
|
|
private List<List<SlotItem>> _SList = new List<List<SlotItem>>();
|
|
private int _Id;
|
|
|
|
#endregion
|
|
|
|
public ColumnList()
|
|
{
|
|
}
|
|
|
|
public ColumnList(int id)
|
|
{
|
|
_Id = id;
|
|
}
|
|
|
|
#region Public properties
|
|
|
|
/// <summary>
|
|
/// Gets the column slot Id
|
|
/// </summary>
|
|
public int Id
|
|
{
|
|
get { return (_Id); }
|
|
set { _Id = value; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets the column slot list
|
|
/// </summary>
|
|
public List<List<SlotItem>> SList
|
|
{
|
|
get { return (_SList); }
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Public methods
|
|
|
|
#region AddColumnSlot
|
|
|
|
/// <summary>
|
|
/// Adds a CalendarItem to the running slot list
|
|
/// </summary>
|
|
/// <param name="item">CalendarItem to add</param>
|
|
/// <param name="n">Slot level to add the item to</param>
|
|
/// <returns>The added slot item</returns>
|
|
public SlotItem AddColumnSlot(CalendarItem item, int n)
|
|
{
|
|
// Add a new SlotItem list if we have exceeded
|
|
// the current list count
|
|
|
|
if (n >= _SList.Count)
|
|
_SList.Add(new List<SlotItem>());
|
|
|
|
// Determine whether this item can fit in the
|
|
// the slot list at the current level
|
|
|
|
SlotItem si = GetColumnSlot(item, n);
|
|
|
|
if (si != null)
|
|
{
|
|
// The item won't fit, so allocate a new slot
|
|
// item and add it to the list
|
|
|
|
si.AddPeerSlot(
|
|
AddColumnSlot(item, n + 1), n + 1);
|
|
}
|
|
else
|
|
{
|
|
// The item will fit, so add it to the list
|
|
|
|
si = new SlotItem(item);
|
|
|
|
_SList[n].Add(si);
|
|
|
|
// Look ahead to see it we have a peer slot
|
|
// in a future slot list
|
|
|
|
while (n + 1 < _SList.Count)
|
|
{
|
|
n++;
|
|
|
|
SlotItem ni = GetColumnSlot(item, n);
|
|
|
|
if (ni != null)
|
|
{
|
|
si.AddPeerSlot(ni, n);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Return the added slot item
|
|
|
|
return (si);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Returns the SlotItem (if present) in the given list for
|
|
/// the CalendarItem in question
|
|
/// </summary>
|
|
/// <param name="item">CalendarItem</param>
|
|
/// <param name="n">Slot level to scan</param>
|
|
/// <returns>SlotItem, if found</returns>
|
|
private SlotItem GetColumnSlot(CalendarItem item, int n)
|
|
{
|
|
if (n < _SList.Count)
|
|
{
|
|
// Loop through each SlotItem at the given
|
|
// level, looking for an intersection with the
|
|
// given CalendarItem
|
|
|
|
List<SlotItem> list = _SList[n];
|
|
|
|
for (int i = 0; i < list.Count; i++)
|
|
{
|
|
SlotItem si = list[i];
|
|
|
|
DateTime start = item.StartTime > si.CItem.StartTime ? item.StartTime : si.CItem.StartTime;
|
|
DateTime end = item.EndTime < si.CItem.EndTime ? item.EndTime : si.CItem.EndTime;
|
|
|
|
// If we found an item, return it
|
|
|
|
if ((start < end) ||
|
|
(start <= end && ( item.StartTime == item.EndTime || si.CItem.StartTime == si.CItem.EndTime)))
|
|
return (si);
|
|
}
|
|
}
|
|
|
|
// Nothing currently at that slot
|
|
|
|
return (null);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region CountColumns
|
|
|
|
/// <summary>
|
|
/// Counts the number of columns for
|
|
/// each column zero entry slot lists
|
|
/// </summary>
|
|
public void CountColumns()
|
|
{
|
|
if (_SList.Count > 0)
|
|
{
|
|
for (int i = 0; i < _SList[0].Count; i++)
|
|
{
|
|
SlotItem si = _SList[0][i];
|
|
|
|
SetColumnCount(si, GetColumnCount(si, 1));
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets the max column count from all
|
|
/// zero level slot paths
|
|
/// </summary>
|
|
/// <param name="si">Initial SlotItem</param>
|
|
/// <param name="count">Running level count</param>
|
|
/// <returns></returns>
|
|
private int GetColumnCount(SlotItem si, int count)
|
|
{
|
|
if (si.Count > 0)
|
|
return (si.Count);
|
|
|
|
int maxCount = count;
|
|
|
|
if (si.SList != null)
|
|
{
|
|
for (int i = 0; i < si.SList.Count; i++)
|
|
{
|
|
int c = GetColumnCount(si.SList[i], count + 1);
|
|
|
|
if (c > maxCount)
|
|
maxCount = c;
|
|
}
|
|
}
|
|
|
|
return (maxCount);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sets all column entry counts to the given
|
|
/// count
|
|
/// </summary>
|
|
/// <param name="si">Initial SlotItem</param>
|
|
/// <param name="count">Count</param>
|
|
private void SetColumnCount(SlotItem si, int count)
|
|
{
|
|
if (si.SList != null)
|
|
{
|
|
for (int i = 0; i < si.SList.Count; i++)
|
|
SetColumnCount(si.SList[i], count);
|
|
}
|
|
|
|
if (si.Count == 0)
|
|
si.Count = count;
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Clear
|
|
|
|
/// <summary>
|
|
/// Clears the Column slot list
|
|
/// </summary>
|
|
public void Clear()
|
|
{
|
|
_SList.Clear();
|
|
}
|
|
|
|
#endregion
|
|
|
|
#endregion
|
|
}
|
|
|
|
#region SlotItem class definition
|
|
|
|
public class SlotItem
|
|
{
|
|
#region Private variables
|
|
|
|
private CalendarItem _CItem; // CalendarItem
|
|
private List<SlotItem> _SList; // List of peer SlotItems
|
|
private int _Count; // Count of peer items
|
|
private int _Column;
|
|
|
|
#endregion
|
|
|
|
/// <summary>
|
|
/// Constructor
|
|
/// </summary>
|
|
/// <param name="cItem">CalendarItem</param>
|
|
public SlotItem(CalendarItem cItem)
|
|
{
|
|
_CItem = cItem;
|
|
}
|
|
|
|
#region Public properties
|
|
|
|
/// <summary>
|
|
/// Gets and sets the slots CalendarItem
|
|
/// </summary>
|
|
public CalendarItem CItem
|
|
{
|
|
get { return (_CItem); }
|
|
set { _CItem = value; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets the peer SlotItem list
|
|
/// </summary>
|
|
public List<SlotItem> SList
|
|
{
|
|
get { return (_SList); }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets and sets the peer level count
|
|
/// </summary>
|
|
public int Count
|
|
{
|
|
get { return (_Count); }
|
|
set { _Count = value; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets and sets the peer column
|
|
/// </summary>
|
|
public int Column
|
|
{
|
|
get { return (_Column); }
|
|
set { _Column = value; }
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Public methods
|
|
|
|
/// <summary>
|
|
/// Adds a slot to the peer SlotItem list
|
|
/// </summary>
|
|
/// <param name="si">SlotItem to add</param>
|
|
/// <param name="column">Slot column</param>
|
|
public void AddPeerSlot(SlotItem si, int column)
|
|
{
|
|
if (si != null)
|
|
{
|
|
if (_SList == null)
|
|
_SList = new List<SlotItem>();
|
|
|
|
if (_SList.Contains(si) == false)
|
|
{
|
|
si.Column = column;
|
|
|
|
_SList.Add(si);
|
|
}
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
#endif
|
|
|