716 lines
19 KiB
C#
716 lines
19 KiB
C#
#if FRAMEWORK20
|
|
using System;
|
|
using System.Windows.Forms;
|
|
using DevComponents.DotNetBar.ScrollBar;
|
|
using System.Drawing;
|
|
using DevComponents.DotNetBar.Controls;
|
|
|
|
namespace DevComponents.DotNetBar.Schedule
|
|
{
|
|
public class TimeLineHScrollPanel : BaseItem
|
|
{
|
|
#region Events
|
|
|
|
public event EventHandler<EventArgs> ScrollPanelChanged;
|
|
|
|
#endregion
|
|
|
|
#region Private variables
|
|
|
|
private CalendarView _CalendarView; // CalendarView
|
|
|
|
private HScrollBarAdv _ScrollBar; // Scroll bar
|
|
private PageNavigator _PageNavigator; // PageNavigator
|
|
|
|
private int _UpdateCount;
|
|
|
|
#endregion
|
|
|
|
/// <summary>
|
|
/// Constructor
|
|
/// </summary>
|
|
/// <param name="calendarView">_CalendarView</param>
|
|
public TimeLineHScrollPanel(CalendarView calendarView)
|
|
{
|
|
_CalendarView = calendarView;
|
|
Name = "TimeLineHScrollPanel";
|
|
|
|
SetUpPanel();
|
|
|
|
Visible = false;
|
|
}
|
|
|
|
#region Public properties
|
|
|
|
/// <summary>
|
|
/// Gets and sets the display bounds
|
|
/// </summary>
|
|
public override Rectangle Bounds
|
|
{
|
|
get { return (base.Bounds); }
|
|
|
|
set
|
|
{
|
|
if (base.Bounds != value)
|
|
{
|
|
base.Bounds = value;
|
|
|
|
UpdatePanel();
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets and sets the visible status
|
|
/// </summary>
|
|
public override bool Visible
|
|
{
|
|
get { return (base.Visible); }
|
|
|
|
set
|
|
{
|
|
if (base.Visible != value)
|
|
{
|
|
base.Visible = value;
|
|
|
|
_ScrollBar.Visible = value;
|
|
|
|
if (_PageNavigator != null)
|
|
_PageNavigator.Visible = value;
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets the ScrollBar
|
|
/// </summary>
|
|
public HScrollBarAdv ScrollBar
|
|
{
|
|
get { return (_ScrollBar); }
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Internal properties
|
|
|
|
internal PageNavigator PageNavigator
|
|
{
|
|
get { return (_PageNavigator); }
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Private properties
|
|
|
|
/// <summary>
|
|
/// Gets the scrollBar SmallChange value
|
|
/// </summary>
|
|
private int ScrollPanelSmallChange
|
|
{
|
|
get { return (1); }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets the scrollBar LargeChange value
|
|
/// </summary>
|
|
private int ScrollPanelLargeChange
|
|
{
|
|
get { return (Math.Min(ScrollPanelMaximum, ScrollBar.Width / _CalendarView.TimeLineColumnWidth)); }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets the scrollBar Maximum value
|
|
/// </summary>
|
|
private int ScrollPanelMaximum
|
|
{
|
|
get { return (_CalendarView.TimeLineColumnCount); }
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region HookScrollEvents
|
|
|
|
/// <summary>
|
|
/// Hooks our ScrollBar events
|
|
/// </summary>
|
|
/// <param name="hook"></param>
|
|
private void HookScrollEvents(bool hook)
|
|
{
|
|
if (hook == true)
|
|
{
|
|
ScrollBar.Scroll += ScrollBarScroll;
|
|
ScrollBar.ValueChanged += ScrollBarValueChanged;
|
|
}
|
|
else
|
|
{
|
|
ScrollBar.Scroll -= ScrollBarScroll;
|
|
ScrollBar.ValueChanged -= ScrollBarValueChanged;
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region HookNavigateEvents
|
|
|
|
/// <summary>
|
|
/// Hooks our PageNavigator events
|
|
/// </summary>
|
|
/// <param name="hook"></param>
|
|
private void HookNavigateEvents(bool hook)
|
|
{
|
|
if (_PageNavigator != null)
|
|
{
|
|
if (hook == true)
|
|
{
|
|
_PageNavigator.NavigateNextPage += NavigateNextPage;
|
|
_PageNavigator.NavigatePreviousPage += NavigatePreviousPage;
|
|
_PageNavigator.NavigateToday += NavigateToday;
|
|
}
|
|
else
|
|
{
|
|
_PageNavigator.NavigateNextPage -= NavigateNextPage;
|
|
_PageNavigator.NavigatePreviousPage -= NavigatePreviousPage;
|
|
_PageNavigator.NavigateToday -= NavigateToday;
|
|
}
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Event handling
|
|
|
|
#region ScrollBar_Scroll
|
|
|
|
/// <summary>
|
|
/// ScrollBar Scroll event handler
|
|
/// </summary>
|
|
/// <param name="sender"></param>
|
|
/// <param name="e"></param>
|
|
void ScrollBarScroll(object sender, ScrollEventArgs e)
|
|
{
|
|
if (e.Type == ScrollEventType.SmallIncrement)
|
|
{
|
|
// The user has right-arrow scrolled to the very end of
|
|
// the scrollbar, so add another time slice to timeline
|
|
|
|
if (ScrollBar.Value >= ScrollBar.Maximum - ScrollBar.LargeChange)
|
|
IncreaseEndDate(1);
|
|
}
|
|
else if (e.Type == ScrollEventType.SmallDecrement)
|
|
{
|
|
// The user has left-arrow scrolled to the very beginning of
|
|
// the scrollbar, so add another time slice to timeline
|
|
|
|
if (ScrollBar.Value == 0)
|
|
DecreaseStartDate(1);
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region ScrollBar_ValueChanged
|
|
|
|
/// <summary>
|
|
/// Processes ScrollBar ValueChanged events
|
|
/// </summary>
|
|
/// <param name="sender"></param>
|
|
/// <param name="e"></param>
|
|
void ScrollBarValueChanged(object sender, EventArgs e)
|
|
{
|
|
OnScrollPanelUpdate();
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region NavigatePreviousPage
|
|
|
|
/// <summary>
|
|
/// Navigates to the previous page
|
|
/// </summary>
|
|
/// <param name="sender"></param>
|
|
/// <param name="e"></param>
|
|
void NavigatePreviousPage(object sender, EventArgs e)
|
|
{
|
|
DateTime startDate;
|
|
|
|
int n = ScrollBar.LargeChange;
|
|
int value = ScrollBar.Value - n;
|
|
|
|
if (value < 0)
|
|
{
|
|
startDate = GetDecreaseStartDate(n);
|
|
}
|
|
else
|
|
{
|
|
startDate =
|
|
_CalendarView.TimeLineViewStartDate.AddMinutes(
|
|
_CalendarView.BaseInterval * -n);
|
|
}
|
|
|
|
if (_CalendarView.DoPageNavigatorClick(_CalendarView.TimeLineView,
|
|
_PageNavigator, PageNavigatorButton.PreviousPage, ref startDate) == false)
|
|
{
|
|
_CalendarView.TimeLineViewStartDate = GetIntervalStartDate(startDate);
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region NavigateToday
|
|
|
|
/// <summary>
|
|
/// Navigates to Today
|
|
/// </summary>
|
|
/// <param name="sender"></param>
|
|
/// <param name="e"></param>
|
|
void NavigateToday(object sender, EventArgs e)
|
|
{
|
|
DateTime startDate = DateTime.Today;
|
|
|
|
if (_CalendarView.DoPageNavigatorClick(_CalendarView.TimeLineView,
|
|
_PageNavigator, PageNavigatorButton.Today, ref startDate) == false)
|
|
{
|
|
if (startDate < _CalendarView.TimeLineViewScrollStartDate ||
|
|
startDate > _CalendarView.TimeLineViewScrollEndDate)
|
|
{
|
|
_CalendarView.TimeLineViewScrollStartDate =
|
|
GetIntervalStartDate(startDate);
|
|
}
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region NavigateNextPage
|
|
|
|
/// <summary>
|
|
/// Navigates to the Next page
|
|
/// </summary>
|
|
/// <param name="sender"></param>
|
|
/// <param name="e"></param>
|
|
void NavigateNextPage(object sender, EventArgs e)
|
|
{
|
|
DateTime startDate;
|
|
|
|
int n = ScrollBar.LargeChange;
|
|
int value = ScrollBar.Value + n;
|
|
|
|
if (value > ScrollBar.Maximum - n)
|
|
{
|
|
startDate = GetIncreaseEndDate(n);
|
|
}
|
|
else
|
|
{
|
|
startDate =
|
|
_CalendarView.TimeLineViewStartDate.AddMinutes(
|
|
_CalendarView.BaseInterval * n);
|
|
}
|
|
|
|
if (_CalendarView.DoPageNavigatorClick(_CalendarView.TimeLineView,
|
|
_PageNavigator, PageNavigatorButton.NextPage, ref startDate) == false)
|
|
{
|
|
_CalendarView.TimeLineViewStartDate = GetIntervalStartDate(startDate);
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region IncreaseEndDate
|
|
|
|
/// <summary>
|
|
/// Increases timeline EndDate
|
|
/// </summary>
|
|
/// <param name="n">Amount to add</param>
|
|
private void IncreaseEndDate(int n)
|
|
{
|
|
if (_CalendarView.TimeLineCanExtendRange == true)
|
|
{
|
|
_CalendarView.TimeLineViewEndDate = GetIncreaseEndDate(n);
|
|
|
|
int value = ScrollBar.Value + n;
|
|
|
|
if (value > ScrollBar.Maximum - ScrollBar.LargeChange)
|
|
value = ScrollBar.Maximum - ScrollBar.LargeChange;
|
|
|
|
if (ScrollBar.Value != value)
|
|
ScrollBar.Value = value;
|
|
else
|
|
OnScrollPanelUpdate();
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region GetIncreaseEndDate
|
|
|
|
/// <summary>
|
|
/// Increases timeline EndDate
|
|
/// </summary>
|
|
/// <param name="n">Amount to add</param>
|
|
private DateTime GetIncreaseEndDate(int n)
|
|
{
|
|
if (_CalendarView.TimeLineCanExtendRange == true)
|
|
{
|
|
DateTime end = new DateTime(9900, 1, 1);
|
|
|
|
try
|
|
{
|
|
DateTime date =
|
|
_CalendarView.TimeLineViewEndDate.AddMinutes(
|
|
_CalendarView.BaseInterval * n);
|
|
|
|
if (date > end)
|
|
date = end;
|
|
|
|
return (date);
|
|
}
|
|
catch
|
|
{
|
|
return (end);
|
|
}
|
|
}
|
|
|
|
return (_CalendarView.TimeLineViewEndDate);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region DecreaseStartDate
|
|
|
|
/// <summary>
|
|
/// Decreases the timeline StartDate
|
|
/// </summary>
|
|
/// <param name="n">Amount to del</param>
|
|
private void DecreaseStartDate(int n)
|
|
{
|
|
if (_CalendarView.TimeLineCanExtendRange == true)
|
|
{
|
|
DateTime startDate = GetDecreaseStartDate(n);
|
|
|
|
_CalendarView.TimeLineViewStartDate = startDate;
|
|
|
|
UpdatePanel();
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region GetDecreaseStartDate
|
|
|
|
/// <summary>
|
|
/// Decreases the timeline StartDate
|
|
/// </summary>
|
|
/// <param name="n">Amount to del</param>
|
|
private DateTime GetDecreaseStartDate(int n)
|
|
{
|
|
if (_CalendarView.TimeLineCanExtendRange == true)
|
|
{
|
|
try
|
|
{
|
|
return (_CalendarView.TimeLineViewStartDate.AddMinutes(
|
|
-_CalendarView.BaseInterval * n));
|
|
}
|
|
catch
|
|
{
|
|
return (new DateTime(1, 1, 1));
|
|
}
|
|
}
|
|
|
|
return (_CalendarView.TimeLineViewStartDate);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region GetIntervalStartDate
|
|
|
|
private DateTime GetIntervalStartDate(DateTime startDate)
|
|
{
|
|
TimeSpan ts = new TimeSpan(startDate.Hour, startDate.Minute, 0);
|
|
|
|
int interval = _CalendarView.TimeLineInterval;
|
|
int minutes = ((int)ts.TotalMinutes / interval) * interval;
|
|
|
|
return (startDate.Date.AddMinutes(minutes));
|
|
}
|
|
|
|
#endregion
|
|
|
|
#endregion
|
|
|
|
#region Begin/EndUpdate
|
|
|
|
/// <summary>
|
|
/// Begins Update block
|
|
/// </summary>
|
|
public void BeginUpdate()
|
|
{
|
|
_UpdateCount++;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Ends update block
|
|
/// </summary>
|
|
public void EndUpdate()
|
|
{
|
|
if (_UpdateCount == 0)
|
|
{
|
|
throw new InvalidOperationException(
|
|
"EndUpdate must be called After BeginUpdate");
|
|
}
|
|
|
|
_UpdateCount--;
|
|
|
|
if (_UpdateCount == 0)
|
|
OnScrollPanelUpdate();
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region SetUpPanel
|
|
|
|
/// <summary>
|
|
/// Performs panel setup
|
|
/// </summary>
|
|
private void SetUpPanel()
|
|
{
|
|
Control c = (Control)_CalendarView.CalendarPanel.GetContainerControl(true);
|
|
|
|
if (c != null)
|
|
{
|
|
SetupPageNavigator(c);
|
|
SetupScrollBar(c);
|
|
|
|
UpdatePanel();
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region SetupPageNavigator
|
|
|
|
/// <summary>
|
|
/// Sets-up the PageNavigator
|
|
/// </summary>
|
|
/// <param name="c"></param>
|
|
private void SetupPageNavigator(Control c)
|
|
{
|
|
_PageNavigator = new PageNavigator();
|
|
|
|
_PageNavigator.Visible = false;
|
|
_PageNavigator.FocusCuesEnabled = false;
|
|
|
|
HookNavigateEvents(true);
|
|
|
|
c.Controls.Add(_PageNavigator);
|
|
|
|
_PageNavigator.NextPageTooltip = _CalendarView.TimeLinePageNavigatorNextPageTooltip;
|
|
_PageNavigator.PreviousPageTooltip = _CalendarView.TimeLinePageNavigatorPreviousPageTooltip;
|
|
_PageNavigator.TodayTooltip = _CalendarView.TimeLinePageNavigatorTodayTooltip;
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region SetupScrollBar
|
|
|
|
private void SetupScrollBar(Control c)
|
|
{
|
|
_ScrollBar = new HScrollBarAdv();
|
|
|
|
_ScrollBar.Visible = false;
|
|
_ScrollBar.Height = SystemInformation.HorizontalScrollBarHeight;
|
|
|
|
HookScrollEvents(true);
|
|
|
|
c.Controls.Add(_ScrollBar);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region UpdatePanel
|
|
|
|
/// <summary>
|
|
/// Updates the panel
|
|
/// </summary>
|
|
public void UpdatePanel()
|
|
{
|
|
if (Bounds.Width > 0)
|
|
{
|
|
UpdatePageNavigator();
|
|
UpdateScrollBar();
|
|
|
|
OnScrollPanelUpdate();
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region UpdatePageNavigator
|
|
|
|
/// <summary>
|
|
/// Updates the PageNavigator
|
|
/// </summary>
|
|
private void UpdatePageNavigator()
|
|
{
|
|
if (_CalendarView.TimeLineShowPageNavigation == true)
|
|
{
|
|
// We are to show the PageNavigator, so allocate it
|
|
// if we haven't done so already
|
|
|
|
if (_PageNavigator == null)
|
|
{
|
|
Control c = (Control)_CalendarView.CalendarPanel.GetContainerControl(true);
|
|
|
|
if (c != null)
|
|
{
|
|
SetupPageNavigator(c);
|
|
|
|
if (_PageNavigator != null)
|
|
_PageNavigator.Visible = Visible;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// We are not to show a PageNavigator, so if we have already
|
|
// allocated one, see that we release it appropriately
|
|
|
|
if (_PageNavigator != null)
|
|
{
|
|
Control c = (Control)_CalendarView.CalendarPanel.GetContainerControl(true);
|
|
|
|
if (c != null)
|
|
{
|
|
c.Controls.Remove(_PageNavigator);
|
|
|
|
HookNavigateEvents(false);
|
|
|
|
_PageNavigator = null;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region UpdateScrollBar
|
|
|
|
/// <summary>
|
|
/// Updates our ScrollBar
|
|
/// </summary>
|
|
private void UpdateScrollBar()
|
|
{
|
|
_ScrollBar.Maximum = ScrollPanelMaximum;
|
|
_ScrollBar.SmallChange = ScrollPanelSmallChange;
|
|
_ScrollBar.LargeChange = ScrollPanelLargeChange;
|
|
|
|
if (_ScrollBar.Value > _ScrollBar.Maximum - _ScrollBar.LargeChange)
|
|
_ScrollBar.Value = _ScrollBar.Maximum - _ScrollBar.LargeChange;
|
|
|
|
_ScrollBar.Refresh();
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region OnScrollPanelUpdate
|
|
|
|
/// <summary>
|
|
/// Passes the scroll onto others
|
|
/// </summary>
|
|
protected void OnScrollPanelUpdate()
|
|
{
|
|
if (_UpdateCount == 0)
|
|
{
|
|
if (ScrollPanelChanged != null)
|
|
ScrollPanelChanged(this, EventArgs.Empty);
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region RecalcSize
|
|
|
|
/// <summary>
|
|
/// Performs control recalc
|
|
/// </summary>
|
|
public override void RecalcSize()
|
|
{
|
|
// Update our PageNavigator
|
|
|
|
UpdatePageNavigator();
|
|
|
|
int navWidth = 0;
|
|
|
|
if (_PageNavigator != null)
|
|
{
|
|
navWidth = _PageNavigator.Width;
|
|
|
|
_PageNavigator.Location =
|
|
new Point(Bounds.Right - navWidth, Bounds.Y);
|
|
}
|
|
|
|
// Update our ScrollBar
|
|
|
|
UpdateScrollBar();
|
|
|
|
if (_ScrollBar != null)
|
|
{
|
|
_ScrollBar.Location = Bounds.Location;
|
|
_ScrollBar.Width = Bounds.Width - navWidth;
|
|
}
|
|
|
|
base.RecalcSize();
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Paint
|
|
|
|
public override void Paint(ItemPaintArgs p)
|
|
{
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Copy
|
|
|
|
/// <summary>
|
|
/// Returns copy of the item
|
|
/// </summary>
|
|
public override BaseItem Copy()
|
|
{
|
|
TimeLineHScrollPanel objCopy = new TimeLineHScrollPanel(_CalendarView);
|
|
|
|
this.CopyToItem(objCopy);
|
|
|
|
return (objCopy);
|
|
}
|
|
/// <summary>
|
|
/// Copies the TimeLineHScrollPanel specific properties to
|
|
/// new instance of the item
|
|
/// </summary>
|
|
/// <param name="copy">New PageNavigatorItem instance</param>
|
|
protected override void CopyToItem(BaseItem copy)
|
|
{
|
|
TimeLineHScrollPanel c = copy as TimeLineHScrollPanel;
|
|
base.CopyToItem(c);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Dispose
|
|
|
|
protected override void Dispose(bool disposing)
|
|
{
|
|
if (disposing == true && IsDisposed == false)
|
|
{
|
|
HookScrollEvents(false);
|
|
HookNavigateEvents(false);
|
|
}
|
|
|
|
base.Dispose(disposing);
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
}
|
|
#endif |