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