1340 lines
38 KiB
C#

#if FRAMEWORK20
using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using DevComponents.DotNetBar.ScrollBar;
using DevComponents.DotNetBar.Touch;
namespace DevComponents.DotNetBar.Schedule
{
public class CalendarPanel : BaseItem
{
#region Private variables
private CalendarView _CalendarView; // Associated CalendarView
private HScrollBarAdv _HScrollBar; // Horizontal scroll bar
private int _HScrollPos;
private int _HsMaximum;
private VScrollBarAdv _VScrollBar; // Vertical scroll bar
private int _VScrollPos;
private int _VsMaximum;
private Size _AutoScrollMinSize = Size.Empty;
private Point _AutoScrollPosition = Point.Empty;
private TouchHandler _TouchHandler;
private Rectangle _InnerBounds;
private HScrollBarAdv _AHScrollBar; // Active Horizontal scroll bar
private VScrollBarAdv _AVScrollBar; // Active Vertical scroll bar
#endregion
/// <summary>
/// This is the main container panel for all
/// BaseView and TimeRulerPanel objects
/// </summary>
/// <param name="calendarView">CalendarView</param>
public CalendarPanel(CalendarView calendarView)
{
_CalendarView = calendarView;
SetIsContainer(true);
_CalendarView.SelectedViewChanged += _CalendarView_SelectedViewChanged;
if (BarFunctions.IsWindows7 && TouchHandler.IsTouchEnabled)
{
_TouchHandler = new TouchHandler(_CalendarView, eTouchHandlerType.Gesture);
_TouchHandler.PanBegin += TouchHandlerPanBegin;
_TouchHandler.Pan += TouchHandlerPan;
_TouchHandler.PanEnd += TouchHandlerPanEnd;
}
}
#region Internal properties
#region AutoScrollMinSize
internal Size AutoScrollMinSize
{
get { return (_AutoScrollMinSize); }
set
{
_AutoScrollMinSize = value;
RecalcSize();
}
}
#endregion
#region AutoScrollPosition
internal Point AutoScrollPosition
{
get
{
Point pt = Point.Empty;
if (_AHScrollBar != null && _AHScrollBar.Visible == true)
pt.X = _AHScrollBar.Value * _CalendarView.TimeLineColumnWidth;
if (_AVScrollBar != null && _AVScrollBar.Visible == true)
pt.Y = _AVScrollBar.Value;
return (pt);
}
set
{
if (_CalendarView.SelectedView == eCalendarView.TimeLine)
{
if (_CalendarView.TimeLineColumnWidth > 0)
value.X /= _CalendarView.TimeLineColumnWidth;
}
if (_AHScrollBar != null && _AHScrollBar.Visible == true)
{
if (value.X != _AHScrollBar.Value)
{
_AHScrollBar.Value =
Math.Min(_AHScrollBar.Maximum,
Math.Max(_AHScrollBar.Minimum, value.X));
}
}
if (_AVScrollBar != null && _AVScrollBar.Visible == true)
{
if (value.Y != _AVScrollBar.Value)
{
_AVScrollBar.Value =
Math.Min(_AVScrollBar.Maximum,
Math.Max(_AVScrollBar.Minimum, value.Y));
}
}
}
}
#endregion
#region AHScrollBar
internal HScrollBarAdv AHScrollBar
{
get { return (_AHScrollBar); }
set { _AHScrollBar = value; }
}
#endregion
#region AVScrollBar
internal VScrollBarAdv AVScrollBar
{
get { return (_AVScrollBar); }
set { _AVScrollBar = value; }
}
#endregion
#region Checkit
internal bool Checkit
{
get { return (m_CheckMouseMovePressed); }
set { m_CheckMouseMovePressed = value; }
}
#endregion
#region HScrollBar
internal HScrollBarAdv HScrollBar
{
get { return (_HScrollBar); }
}
#endregion
#region InnerBounds
internal Rectangle InnerBounds
{
get { return (_InnerBounds); }
}
#endregion
#region VScrollBar
internal VScrollBarAdv VScrollBar
{
get { return (_VScrollBar); }
}
#endregion
#endregion
#region Event processing
/// <summary>
/// Handles SelectedView changes
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void _CalendarView_SelectedViewChanged(object sender, SelectedViewEventArgs e)
{
if (e.OldValue == eCalendarView.TimeLine)
{
if (_AVScrollBar != null)
_AVScrollBar.Visible = false;
}
if (e.NewValue == eCalendarView.TimeLine)
{
if (_HScrollBar != null)
_HScrollBar.Visible = false;
}
switch (e.NewValue)
{
case eCalendarView.TimeLine:
AVScrollBar = VScrollBar;
AHScrollBar = _CalendarView.TimeLineHScrollPanel.ScrollBar;
break;
case eCalendarView.Day:
case eCalendarView.Week:
AVScrollBar = _CalendarView.WeekDayVScrollBar;
AHScrollBar = HScrollBar;
break;
case eCalendarView.Year:
AVScrollBar = _CalendarView.YearVScrollPanel.ScrollBar;
AHScrollBar = HScrollBar;
break;
default:
AVScrollBar = null;
AHScrollBar = null;
break;
}
Size asMinSize = Size.Empty;
if (_AVScrollBar != null && _AVScrollBar.Visible == true)
asMinSize.Height = _AVScrollBar.Maximum;
if (_AHScrollBar != null && _AHScrollBar.Visible == true)
{
asMinSize.Width = _AHScrollBar.Maximum;
if (e.NewValue == eCalendarView.TimeLine)
asMinSize.Width *= _CalendarView.TimeLineColumnWidth;
}
_AutoScrollMinSize = asMinSize;
}
#endregion
#region RecalcSize
/// <summary>
/// Performs object recalc processing
/// </summary>
public override void RecalcSize()
{
_InnerBounds = Bounds;
if (SubItems.Count > 0)
{
if (Bounds.Width > 0 && Bounds.Height > 0)
{
switch (_CalendarView.SelectedView)
{
case eCalendarView.Day:
case eCalendarView.Week:
RecalcWeekDay();
break;
case eCalendarView.Month:
RecalcMonth();
break;
case eCalendarView.Year:
RecalcYear();
break;
case eCalendarView.TimeLine:
RecalcTimeLine();
break;
}
base.RecalcSize();
}
}
}
#region RecalcWeekDay
/// <summary>
/// Recalculates all WeekDay views
/// </summary>
private void RecalcWeekDay()
{
// Calculate the necessary params for calculating
// the divided width for each subItems in our panel
int trWidth = 0;
int vsWidth = 0;
int vCount = SubItems.Count;
if (SubItems[0] is VScrollPanel)
{
vCount--;
vsWidth = _CalendarView.VsWidth;
if (SubItems[1] is TimeRulerPanel)
{
vCount--;
trWidth = _CalendarView.TimeRulerWidth;
}
}
// Configure the subItems based upon the
// previously calculated display params
if (vCount > 0)
ConfigureWeekDayItems(vCount, trWidth, vsWidth);
_InnerBounds.X += trWidth;
_InnerBounds.Width -= (trWidth + vsWidth);
_InnerBounds.Y += _CalendarView.WeekDayVScrollBar.Location.Y;
_InnerBounds.Height -= _InnerBounds.Y;
}
#region ConfigureWeekDayItems
/// <summary>
/// Configures the CalendarPanel subItems
/// </summary>
/// <param name="vCount">View count</param>
/// <param name="trWidth">TimeRuler width</param>
/// <param name="vsWidth">Vert Scrollbar width</param>
private void ConfigureWeekDayItems(int vCount, int trWidth, int vsWidth)
{
Rectangle r = Bounds;
// Calculate our default viewWidth
int bvWidth = Bounds.Width - (trWidth + vsWidth);
float viewWidth = (float)bvWidth / vCount;
// Sync our current item params with our current
// horizontal scrollBar states
ConfigDhScrollBar(ref r,
ref viewWidth, vCount, trWidth, vsWidth);
// If we have a TimRulerPanel, then
// set it's location and size
if (trWidth > 0)
{
r.X = Bounds.X;
r.Width = trWidth;
SubItems[1].Bounds = r;
SubItems[1].RecalcSize();
}
// Loop through each BaseView item,
// setting it's location and size
_CalendarView.StartSlice = -1;
_CalendarView.NumberOfSlices = 0;
float fxPos = Bounds.X + trWidth + _HScrollPos;
BaseView view = null;
int n = vCount;
for (int i = 0; i < SubItems.Count; i++)
{
if (SubItems[i] is BaseView)
{
r.X = (int)fxPos;
fxPos += viewWidth;
r.Width = (int)(fxPos - r.X - (--n > 0 ? 2 : 0));
SubItems[i].Bounds = r;
SubItems[i].Displayed = r.IntersectsWith(Bounds);
if (SubItems[i].Displayed == true)
{
view = SubItems[i] as BaseView;
if (view != null)
{
view.NeedRecalcLayout = true;
view.RecalcSize();
}
}
}
}
// If we need to align the WorkDay times, then
// make sure all displayed WeekDay views are kept in sync
if (_CalendarView.ShowOnlyWorkDayHours == true && _CalendarView.IsMultiCalendar == true)
{
for (int i = 0; i < SubItems.Count; i++)
{
WeekDayView wv = SubItems[i] as WeekDayView;
if (wv != null && wv.Displayed == true)
{
if (wv.LocalStartSlice != _CalendarView.StartSlice ||
wv.LocalNumberOfSlices != _CalendarView.NumberOfSlices)
{
wv.NeedRecalcLayout = true;
wv.RecalcSize();
}
}
}
}
// If we have a VScrollPanel, then
// set it's location and size
if (vsWidth > 0)
{
r.X = Bounds.Right - vsWidth;
r.Width = vsWidth;
int delta = _CalendarView.AllDayPanelHeight;
r.Y = delta;
r.Height = 50;
if (view != null)
{
r.Y += view.ClientRect.Y + view.DayOfWeekHeaderHeight;
r.Height = Math.Max(r.Height, view.ClientRect.Height - (delta + view.DayOfWeekHeaderHeight));
}
SubItems[0].Bounds = r;
SubItems[0].RecalcSize();
}
}
#endregion
#endregion
#region RecalcMonth
/// <summary>
/// Recalculates Month views
/// </summary>
private void RecalcMonth()
{
// Configure the subItems based upon the
// previously calculated display params
ConfigureMonthItems(SubItems.Count);
}
#region ConfigureMonthItems
/// <summary>
/// Configures the CalendarPanel subItems
/// </summary>
/// <param name="vCount">View count</param>
private void ConfigureMonthItems(int vCount)
{
Rectangle r = Bounds;
// Calculate our default viewWidth
float viewWidth = (float)Bounds.Width / vCount;
// Sync our current item params with our current
// horizontal scrollBar states
ConfigDhScrollBar(ref r, ref viewWidth, vCount, 0, 0);
// Loop through each BaseView item,
// setting it's location and size
float fxPos = Bounds.X + _HScrollPos;
int n = vCount;
for (int i = 0; i < SubItems.Count; i++)
{
if (SubItems[i] is BaseView)
{
r.X = (int)fxPos;
fxPos += viewWidth;
r.Width = (int)(fxPos - r.X - (--n > 0 ? 2 : 0));
SubItems[i].Bounds = r;
SubItems[i].Displayed = r.IntersectsWith(Bounds);
if (SubItems[i].Displayed == true)
{
BaseView view = SubItems[i] as BaseView;
if (view != null)
{
view.NeedRecalcLayout = true;
view.RecalcSize();
}
}
}
}
}
#endregion
#endregion
#region RecalcYear
/// <summary>
/// Recalculates all Year views
/// </summary>
private void RecalcYear()
{
// Calculate the necessary params for calculating
// the divided width for each subItems in our panel
int vsWidth = 0;
int vCount = SubItems.Count;
if (SubItems[0] is VScrollPanel)
{
vCount--;
vsWidth = _CalendarView.VsWidth;
}
// Configure the subItems based upon the
// previously calculated display params
if (vCount > 0)
ConfigureYearItems(vCount, vsWidth);
_InnerBounds.Y = _CalendarView.YearVScrollPanel.ScrollBar.Location.Y;
_InnerBounds.Height -= _InnerBounds.Y;
}
#region ConfigureYearItems
/// <summary>
/// Configures the CalendarPanel subItems
/// </summary>
/// <param name="vCount">View count</param>
/// <param name="vsWidth">Vert Scrollbar width</param>
private void ConfigureYearItems(int vCount, int vsWidth)
{
Rectangle r = Bounds;
// Calculate our default viewWidth
int bvWidth = Bounds.Width;
float viewWidth = (float) bvWidth/vCount;
// Sync our current item params with our current
// horizontal scrollBar states
ConfigDhScrollBar(ref r, ref viewWidth, vCount, 0, vsWidth);
// Locate and calculate the default size of our YearView
BaseView view = null;
for (int i = 0; i < SubItems.Count; i++)
{
view = SubItems[i] as BaseView;
if (view != null)
{
Rectangle t = r;
t.Width = (int) viewWidth;
SubItems[i].Bounds = t;
view.NeedRecalcLayout = true;
view.RecalcSize();
break;
}
}
if (view != null)
{
// If we have a VScrollPanel, then
// set it's location and size
if (vsWidth > 0)
{
if (_CalendarView.YearViewMax + 1 == view.ClientRect.Height)
{
SubItems[0].Visible = false;
((VScrollPanel)SubItems[0]).DisableScrollBar();
}
else
{
bvWidth = Bounds.Width - vsWidth;
viewWidth = (float)bvWidth / vCount;
r = Bounds;
ConfigDhScrollBar(ref r, ref viewWidth, vCount, 0, vsWidth);
Rectangle t = r;
t.Y += view.ClientRect.Y;
t.Height = Math.Max(50, view.ClientRect.Height);
t.X = Bounds.Right - vsWidth;
t.Width = vsWidth;
SubItems[0].Bounds = t;
SubItems[0].RecalcSize();
SubItems[0].Visible = true;
}
}
// Loop through each BaseView item,
// setting it's location and size
float fxPos = Bounds.X + _HScrollPos;
int n = vCount;
for (int i = 0; i < SubItems.Count; i++)
{
if (SubItems[i] is BaseView)
{
r.X = (int) fxPos;
fxPos += viewWidth;
r.Width = (int) (fxPos - r.X - (--n > 0 ? 2 : 0));
SubItems[i].Bounds = r;
SubItems[i].Displayed = r.IntersectsWith(Bounds);
if (SubItems[i].Displayed == true)
{
view = SubItems[i] as BaseView;
if (view != null)
{
view.NeedRecalcLayout = true;
view.RecalcSize();
}
}
}
}
}
}
#endregion
#endregion
#region RecalcTimeLine
/// <summary>
/// Recalculates TimeLine views
/// </summary>
private void RecalcTimeLine()
{
int vCount = SubItems.Count;
if (SubItems.Contains("TimeLineHScrollPanel"))
vCount--;
if (SubItems.Contains("TimeLineHeaderPanel"))
vCount--;
if (vCount > 0)
ConfigureTItems(vCount);
}
#region ConfigureTItems
/// <summary>
/// Configures TimeLine view items
/// </summary>
/// <param name="vCount"></param>
private void ConfigureTItems(int vCount)
{
Rectangle r = Bounds;
if (_CalendarView.TimeLineShowHScrollBar == true)
r.Height -= _CalendarView.HsHeight;
// TimeLineHeaderPanel
int headerHeight = 0;
int iHeaderPanel = SubItems.IndexOf("TimeLineHeaderPanel");
if (iHeaderPanel >= 0)
{
if (iHeaderPanel != 0)
{
BaseItem bi = SubItems[iHeaderPanel];
SubItems.RemoveAt(iHeaderPanel);
SubItems.Insert(0, bi);
iHeaderPanel = 0;
}
if (_CalendarView.TimeLineShowIntervalHeader == true)
headerHeight += _CalendarView.TimeLineIntervalHeaderHeight;
if (_CalendarView.TimeLineShowPeriodHeader == true)
headerHeight += _CalendarView.TimeLinePeriodHeaderHeight;
r.Y += headerHeight;
r.Height -= headerHeight;
}
_InnerBounds.Y = r.Y;
_InnerBounds.Height = r.Height;
// Calculate our viewHeight
int vsWidth = 0;
float viewHeight = (float) r.Height/vCount;
if (_CalendarView.TimeLineHeight > viewHeight)
{
viewHeight = _CalendarView.TimeLineHeight;
vsWidth = _CalendarView.VsWidth;
}
// VScrollPanel
ConfigureTvScrollBar(r, vCount, vsWidth);
// Sync our current item params with our current
// horizontal scrollBar states
r.Width -= vsWidth;
Rectangle r2 = r;
if (_CalendarView.IsMultiCalendar == true &&
_CalendarView.ShowTabs == true)
{
if (_CalendarView.TimeLineMultiUserTabOrientation == eOrientation.Vertical)
{
r2.X += _CalendarView.MultiUserTabHeight + 4;
r2.Width -= (_CalendarView.MultiUserTabHeight + 4);
}
else
{
r2.X += _CalendarView.TimeLineMultiUserTabWidth + 4;
r2.Width -= (_CalendarView.TimeLineMultiUserTabWidth + 4);
}
_InnerBounds.X = r2.X;
_InnerBounds.Width = r2.Width;
}
// TimeLineHeaderPanel
if (iHeaderPanel >= 0)
{
r2.Y = Bounds.Y;
r2.Height = headerHeight;
SubItems[iHeaderPanel].Bounds = r2;
SubItems[iHeaderPanel].RecalcSize();
}
// TimeLineView
r2 = r;
float fxPos = r2.Y + _VScrollPos;
for (int i = 0; i < SubItems.Count; i++)
{
if (SubItems[i] is TimeLineView)
{
r2.Y = (int) fxPos;
fxPos += viewHeight;
r2.Height = (int) (fxPos - r2.Y);
SubItems[i].Bounds = r2;
SubItems[i].Displayed = r2.IntersectsWith(Bounds);
if (SubItems[i].Displayed == true)
SubItems[i].RecalcSize();
}
}
// If we have an HScrollPanel, then
// set it's location and size
int iScrollPanel = SubItems.IndexOf("TimeLineHScrollPanel");
if (iScrollPanel >= 0)
{
if (_CalendarView.IsMultiCalendar == true &&
_CalendarView.ShowTabs == true)
{
if (_CalendarView.TimeLineMultiUserTabOrientation == eOrientation.Vertical)
{
r.X += (_CalendarView.MultiUserTabHeight + 4);
r.Width -= (_CalendarView.MultiUserTabHeight + 4);
}
else
{
r.X += (_CalendarView.TimeLineMultiUserTabWidth + 4);
r.Width -= (_CalendarView.TimeLineMultiUserTabWidth + 4);
}
}
r.Y = Bounds.Bottom - _CalendarView.HsHeight;
r.Height = _CalendarView.HsHeight;
SubItems[iScrollPanel].Bounds = r;
SubItems[iScrollPanel].RecalcSize();
}
}
#endregion
#endregion
#region Horizontal scrollbar support
#region ConfigDhScrollBar
/// <summary>
/// Configures default view horizontal scrollBar
/// </summary>
/// <param name="r"></param>
/// <param name="viewWidth"></param>
/// <param name="vCount"></param>
/// <param name="trWidth"></param>
/// <param name="vsWidth"></param>
private void ConfigDhScrollBar(ref Rectangle r,
ref float viewWidth, int vCount, int trWidth, int vsWidth)
{
if (_CalendarView.ViewWidth > viewWidth)
{
viewWidth = _CalendarView.ViewWidth + 2;
r.Height -= _CalendarView.HsHeight;
_HsMaximum = (int)(viewWidth * vCount);
if (_HScrollBar == null)
SetUpDhScrollBar();
if (_HScrollBar != null)
{
UpdateDhScrollBar(trWidth, vsWidth);
if (_HScrollBar.Value > _HsMaximum - _HScrollBar.LargeChange + 1)
{
_HScrollPos = -_HsMaximum - _HScrollBar.LargeChange;
_HScrollBar.Value = _HsMaximum - _HScrollBar.LargeChange;
}
}
}
else
{
if (_HScrollBar != null)
{
_HScrollPos = 0;
_HScrollBar.Value = 0;
_HScrollBar.Visible = false;
}
}
}
#endregion
#region SetUpDhScrollBar
/// <summary>
/// Sets up default view horizontal scrollbar
/// </summary>
private void SetUpDhScrollBar()
{
_HScrollBar = new HScrollBarAdv();
_HScrollBar.Height = _CalendarView.HsHeight;
Control c = (Control)this.GetContainerControl(true);
if (c != null)
c.Controls.Add(_HScrollBar);
_HScrollBar.ValueChanged += DhScrollBarValueChanged;
}
#endregion
#region UpdateDhScrollBar
/// <summary>
/// Updates default view horizontal scrollbar
/// </summary>
private void UpdateDhScrollBar(int trWidth, int vsWidth)
{
Point pt = new Point(Bounds.X + trWidth,
Bounds.Bottom - _CalendarView.HsHeight);
_HScrollBar.Location = pt;
_HScrollBar.Width = Math.Max(50, Bounds.Width - (trWidth + vsWidth));
_HScrollBar.SmallChange = 10;
_HScrollBar.LargeChange = _HScrollBar.Width;
_HScrollBar.Maximum = _HsMaximum;
_HScrollBar.Visible = true;
_HScrollBar.BringToFront();
_HScrollBar.Refresh();
}
#endregion
#region DhScrollBarValueChanged
/// <summary>
/// Processes default view horizontal
/// scrollbar value changes
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void DhScrollBarValueChanged(object sender, EventArgs e)
{
if (_HScrollPos != -_HScrollBar.Value)
{
_HScrollPos = -_HScrollBar.Value;
NeedRecalcSize = true;
Refresh();
}
}
#endregion
#endregion
#region Vertical scrollbar support
#region ConfigureTvScrollBar
/// <summary>
/// Configures TimeLine View vertical scrollbar
/// </summary>
/// <param name="r"></param>
/// <param name="vCount"></param>
/// <param name="vsWidth"></param>
private void ConfigureTvScrollBar(Rectangle r, int vCount, int vsWidth)
{
if (vsWidth > 0)
{
_VsMaximum = _CalendarView.TimeLineHeight * vCount + 2;
if (_VScrollBar == null)
SetUpTvScrollBar();
if (_VScrollBar != null)
{
UpdateTvScrollBar(r, vsWidth);
if (_VScrollBar.Value > _VsMaximum)
_VScrollBar.Value = _VsMaximum;
}
}
else
{
if (_VScrollBar != null)
{
_VScrollPos = 0;
_VScrollBar.Value = 0;
_VScrollBar.Visible = false;
}
}
}
#endregion
#region SetUpTvScrollBar
/// <summary>
/// Sets up TimeLine vertical scrollbar
/// </summary>
private void SetUpTvScrollBar()
{
_VScrollBar = new VScrollBarAdv();
_VScrollBar.Width = _CalendarView.VsWidth;
Control c = (Control)this.GetContainerControl(true);
if (c != null)
c.Controls.Add(_VScrollBar);
_VScrollBar.ValueChanged += VScrollBar_ValueChanged;
}
#endregion
#region UpdateTvScrollBar
/// <summary>
/// Updates our vertical scrollbar
/// </summary>
/// <param name="r"></param>
/// <param name="vsWidth"></param>
private void UpdateTvScrollBar(Rectangle r, int vsWidth)
{
Point pt = new Point(r.Right - vsWidth, r.Top);
_VScrollBar.Location = pt;
_VScrollBar.Height = Math.Max(30, r.Height);
_VScrollBar.SmallChange = _CalendarView.TimeLineHeight;
_VScrollBar.LargeChange = _VScrollBar.Height;
_VScrollBar.Maximum = _VsMaximum;
_VScrollBar.Visible = true;
_VScrollBar.BringToFront();
_VScrollBar.Refresh();
}
#endregion
#region VScrollBar_ValueChanged
/// <summary>
/// Processes TimeLine vertical scrollbar changes
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void VScrollBar_ValueChanged(object sender, EventArgs e)
{
if (_VScrollPos != -_VScrollBar.Value)
{
_VScrollPos = -_VScrollBar.Value;
NeedRecalcSize = true;
Refresh();
}
}
#endregion
#endregion
#endregion
#region Paint
/// <summary>
/// Paint processing
/// </summary>
/// <param name="e"></param>
public override void Paint(ItemPaintArgs e)
{
if (_CalendarView.IsUpdateSuspended == false)
{
if (SubItems.Count > 0)
{
PaintNonViewItems(e);
PaintBaseViewItems(e);
}
}
}
/// <summary>
/// Paints the non-BaseView items
/// </summary>
/// <param name="e">ItemPaintArgs</param>
private void PaintNonViewItems(ItemPaintArgs e)
{
// Loop through each item, initiating
// a paint on each one
for (int i = 0; i < SubItems.Count; i++)
{
if ((SubItems[i] is BaseView) == false)
{
if (SubItems[i].Bounds.IntersectsWith(e.ClipRectangle))
SubItems[i].Paint(e);
}
}
}
/// <summary>
/// Paints the BaseView items
/// </summary>
/// <param name="e">ItemPaintArgs</param>
private void PaintBaseViewItems(ItemPaintArgs e)
{
Rectangle r = Bounds;
if (_CalendarView.SelectedView == eCalendarView.TimeLine)
{
int n = 0;
if (_CalendarView.TimeLineShowIntervalHeader == true)
n += _CalendarView.TimeLineIntervalHeaderHeight;
if (_CalendarView.TimeLineShowPeriodHeader == true)
n += _CalendarView.TimeLinePeriodHeaderHeight;
r.Y += n;
if (_CalendarView.TimeLineShowHScrollBar == true)
r.Height -= (_CalendarView.HsHeight + n);
}
else
{
if (SubItems[0] is VScrollPanel)
{
if (SubItems[0].Visible == true)
r.Width -= _CalendarView.VsWidth;
}
if (SubItems.Count > 1 && SubItems[1] is TimeRulerPanel)
{
r.X = _CalendarView.TimeRulerWidth;
r.Width -= _CalendarView.TimeRulerWidth;
}
}
Region rgnSave = e.Graphics.Clip;
using (Region rgn = new Region(r))
{
e.Graphics.Clip = rgn;
for (int i = 0; i < SubItems.Count; i++)
{
if (SubItems[i] is BaseView)
{
if (SubItems[i].Displayed == true)
SubItems[i].Paint(e);
}
}
}
e.Graphics.Clip = rgnSave;
}
#endregion
#region Touch Handling
#region Private variables
private bool _TouchDrag;
private Point _TouchStartLocation;
private Point _TouchStartScrollPosition;
private Rectangle _TouchInnerBounds;
#endregion
#region Private properties
private int MaximumReversePageOffset
{
get { return 0; }
}
#endregion
#region TouchHandlerPanBegin
private void TouchHandlerPanBegin(object sender, Touch.GestureEventArgs e)
{
if (_CalendarView.TouchEnabled == true)
{
_TouchInnerBounds = _InnerBounds;
_TouchStartLocation = e.Location;
_TouchStartScrollPosition = AutoScrollPosition;
_TouchDrag = true;
e.Handled = true;
}
}
#endregion
#region TouchHandlerPan
private void TouchHandlerPan(object sender, Touch.GestureEventArgs e)
{
if (_TouchDrag)
{
Point autoScrollPosition = AutoScrollPosition;
Size autoScrollMinSize = AutoScrollMinSize;
int offset = (_TouchStartLocation.X - e.Location.X);
int offsetChange = offset + _TouchStartScrollPosition.X;
// X Scroll
bool overflowH = false;
if (autoScrollMinSize.Width > _TouchInnerBounds.Width)
{
if (offsetChange + MaximumReversePageOffset > autoScrollMinSize.Width)
{
autoScrollPosition.X = autoScrollMinSize.Width;
overflowH = true;
}
else if (offsetChange < MaximumReversePageOffset)
{
autoScrollPosition.X = MaximumReversePageOffset;
overflowH = true;
}
else
autoScrollPosition.X = offsetChange;
}
// Y Scroll
bool overflowV = false;
if (autoScrollMinSize.Height > _TouchInnerBounds.Height)
{
offset = (_TouchStartLocation.Y - e.Location.Y);
offsetChange = offset + _TouchStartScrollPosition.Y;
if (offsetChange + MaximumReversePageOffset > autoScrollMinSize.Height)
{
autoScrollPosition.Y = autoScrollMinSize.Height;
overflowV = true;
}
else if (offsetChange < MaximumReversePageOffset)
{
autoScrollPosition.Y = MaximumReversePageOffset;
overflowV = true;
}
else
autoScrollPosition.Y = offsetChange;
}
if (AutoScrollPosition != autoScrollPosition)
{
AutoScrollPosition = autoScrollPosition;
Update();
}
if (overflowH && overflowV && e.IsInertia)
EndTouchPan();
e.Handled = true;
}
}
#endregion
#region TouchHandlerPanEnd
private void TouchHandlerPanEnd(object sender, Touch.GestureEventArgs e)
{
if (_TouchDrag)
{
EndTouchPan();
e.Handled = true;
}
}
#endregion
#region EndTouchPan
private void EndTouchPan()
{
_TouchDrag = false;
Point autoScrollPosition = AutoScrollPosition;
Size autoScrollMinSize = AutoScrollMinSize;
if (autoScrollMinSize.Width > _TouchInnerBounds.Width)
{
if (autoScrollMinSize.Width < autoScrollPosition.X)
autoScrollPosition = new Point(autoScrollMinSize.Width, autoScrollPosition.Y);
else if (autoScrollPosition.X < 0)
autoScrollPosition = new Point(0, autoScrollPosition.Y);
}
if (autoScrollMinSize.Height > _TouchInnerBounds.Height)
{
if (autoScrollMinSize.Height < autoScrollPosition.Y)
autoScrollPosition = new Point(autoScrollPosition.X, autoScrollMinSize.Height);
else if (autoScrollPosition.Y < 0)
autoScrollPosition = new Point(autoScrollPosition.X, 0);
}
if (AutoScrollPosition != autoScrollPosition)
AutoScrollPosition = autoScrollPosition;
}
#endregion
#endregion
#region Copy
/// <summary>
/// Returns copy of the item.
/// </summary>
public override BaseItem Copy()
{
CalendarPanel objCopy = new CalendarPanel(_CalendarView);
CopyToItem(objCopy);
return (objCopy);
}
/// <summary>
/// Copies the CalendarPanel specific properties to new instance of the item.
/// </summary>
/// <param name="copy">New CalendarPanel instance</param>
protected override void CopyToItem(BaseItem copy)
{
CalendarPanel objCopy = copy as CalendarPanel;
base.CopyToItem(objCopy);
}
#endregion
}
}
#endif