#if FRAMEWORK20
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
using DevComponents.Schedule.Model;
namespace DevComponents.DotNetBar.Schedule
{
public class BaseView : BaseItem
{
#region Events
///
/// Occurs when SelectedItem has Changed
///
public event EventHandler SelectedItemChanged;
///
/// Occurs when CalendarColor has Changed
///
public event EventHandler CalendarColorChanged;
#endregion
#region Constants
protected const int DaysInWeek = 7;
private const int TabRadius = 3;
private const int TabDia = TabRadius * 2;
#endregion
#region Static variables
private static DateTime _oldStartTime; // Pre-move/resize CalendarItem StartTime
private static DateTime _oldEndTime; // Pre-move/resize CalendarItem EndTime
private static string _oldOwnerKey; // Pre-move CalendarItem OwnerKey
#endregion
#region SubClasses
internal class NonClientData
{
#region Data members
public eTabOrientation TabOrientation; // Tab orientation
public int TabBorder; // Tab border color
public int TabFore; // Tab foreground color
public int TabBack; // Tab background color
public int ContBack; // Tab content background
public int TabSelFore; // Tab selected foreground
public int TabSelBack; // Tab selected background
#endregion
///
/// Constructor
///
/// Tab Orientation
/// Tab border color
/// Tab foreground color
/// Tab background color
/// Tab content background
/// Tab selected foreground
/// Tab selected background
public NonClientData(
eTabOrientation tabOrientation,
int tabBorder, int tabFore, int tabBack,
int contBack, int tabSelFore, int tabSelBack)
{
TabOrientation = tabOrientation;
TabBorder = tabBorder;
TabFore = tabFore;
TabBack = tabBack;
ContBack = contBack;
TabSelFore = tabSelFore;
TabSelBack = tabSelBack;
}
}
#endregion
#region Private variables
private CalendarView _CalendarView; // CalendarView
private eCalendarView _ECalendarView; // Enum CalendarView
private ModelViewConnector _Connector; // Connector
private DateTime? _DateSelectionStart; // Date selection start
private DateTime? _DateSelectionEnd; // Date selection end
private DateTime? _DateSelectionAnchor; // Date selection anchor
private DateTime _StartDate; // Display start date
private DateTime _EndDate; // Display end date
private bool _DateRangeChanged; // Date range has changed
private CalendarColor _CalendarColor; // CalendarColor
private Rectangle _ClientRect; // View client area
private NonClientData _NClientData; // Non-client data
private int _TabWidth; // Tab width
private PosWin _PosWin; // Move/Resize Position window
private bool _IsMouseDown; // Mouse is down
private bool _IsMoving; // Flag denoting app moving
private bool _IsStartResizing; // Flag denoting appt start resizing
private bool _IsEndResizing; // Flag denoting appt end resizing
private bool _IsTabMoving; // Flag denoting Tab is moving
private bool _IsCondMoving; // Flag denoting Condensed view movement
private bool _IsCopyDrag; // Flag denoting Appointment copy is dragging
private bool _IsNewCopyDrag;
private int _LastViewIndex; // Last MultiUser view index
private string _OwnerKey; // Owner key
private string _DisplayName; // Display name
private int _DisplayedOwnerKeyIndex = -1; // DisplayedOwnerKey index
private bool _IsViewSelected; // View selected?
private bool _IsSelecting; // Selection inprogress flag
private CalendarItem _SelectedItem; // Selected CalendarItem
private bool _NeedRecalcLayout = true; // Layout needs recalculated
private DaysOfTheWeek _DaysOfTheWeek; // Days of the week
private Font _Font = SystemFonts.CaptionFont; // Display font
private Font _BoldFont = // Bold display font
new Font(SystemFonts.CaptionFont, FontStyle.Bold);
#endregion
///
/// Constructor
///
///
///
public BaseView(CalendarView calendarView, eCalendarView ecv)
{
// Save the provided CalendarView and
// tell the system we are a container
_CalendarView = calendarView;
_ECalendarView = ecv;
SetIsContainer(true);
SubItems.AllowParentRemove = false;
// Make sure we see all our mouse events
MouseDownCapture = true;
MouseUpNotification = true;
// Hook our events
HookEvents(true);
}
#region Public properties
#region BoldFont
///
/// Gets the Bold display font
///
public Font BoldFont
{
get { return (_BoldFont); }
}
#endregion
#region Bounds
///
/// Gets and sets the view bounding rectangle
///
public override Rectangle Bounds
{
get { return (base.Bounds); }
set
{
if (base.Bounds != value)
{
Rectangle r = base.Bounds;
base.Bounds = value;
InvalidateRect(r);
NeedRecalcLayout = true;
}
}
}
#endregion
#region DisplayedOwnerKey
///
/// Gets and sets the DisplayedOwnerKey
///
public string DisplayedOwnerKey
{
get
{
if (_DisplayedOwnerKeyIndex < 0 ||
_DisplayedOwnerKeyIndex > _CalendarView.DisplayedOwners.Count)
{
return ("");
}
return (_CalendarView.DisplayedOwners[_DisplayedOwnerKeyIndex]);
}
}
///
/// Gets and sets the DisplayedOwnerKeyIndex
///
public int DisplayedOwnerKeyIndex
{
get { return (_DisplayedOwnerKeyIndex); }
internal set { _DisplayedOwnerKeyIndex = value; }
}
///
/// Gets and sets the view Owner Key
///
public string OwnerKey
{
get { return (_OwnerKey); }
internal set { _OwnerKey = value; }
}
///
/// Gets and sets the view Display Name
///
public string DisplayName
{
get { return (_DisplayName); }
set
{
if (_DisplayName != value)
{
_DisplayName = value;
this.Refresh();
}
}
}
#endregion
#region Start/EndDate
///
/// Gets and sets the display start date
///
public DateTime StartDate
{
get { return (_StartDate); }
set
{
if (_StartDate != value)
{
_StartDate = value;
_DateRangeChanged = true;
NeedRecalcLayout = true;
}
}
}
///
/// Gets and sets the display end date
///
public DateTime EndDate
{
get { return (_EndDate); }
set
{
if (_EndDate != value)
{
_EndDate = value;
_DateRangeChanged = true;
NeedRecalcLayout = true;
}
}
}
#endregion
#region DateSelectionStart
///
/// Gets and sets the date selection start
///
public DateTime? DateSelectionStart
{
get { return (_DateSelectionStart); }
set
{
if (_DateSelectionStart != value)
{
_DateSelectionStart = value;
// Update our dayRects selection status
UpdateDateSelection();
}
}
}
#endregion
#region DateSelectionEnd
///
/// Gets or sets the end date of selection.
///
public DateTime? DateSelectionEnd
{
get { return (_DateSelectionEnd); }
set
{
if (_DateSelectionEnd != value)
{
_DateSelectionEnd = value;
// Update our dayRects selection status
UpdateDateSelection();
}
}
}
#endregion
#region CalendarColorTable
///
/// Gets and sets the CalendarColorTable
///
public CalendarColor CalendarColorTable
{
get { return (_CalendarColor); }
internal set { _CalendarColor = value; }
}
#endregion
#region CalendarColor
///
/// Gets and sets the display calendar color scheme
///
public eCalendarColor CalendarColor
{
get { return (_CalendarColor.ColorSch); }
set
{
if (_CalendarColor.ColorSch != value)
{
eCalendarColor oldValue = _CalendarColor.ColorSch;
_CalendarColor.ColorSch = value;
OnCalendarColorChanged(oldValue, value);
if (IsViewSelected == true)
InvalidateRect(Bounds);
}
}
}
///
/// OnCalendarColorChanged event propagation
///
protected virtual void
OnCalendarColorChanged(eCalendarColor oldValue, eCalendarColor newValue)
{
if (CalendarColorChanged != null)
{
CalendarColorChanged(this,
new CalendarColorChangedEventArgs(oldValue, newValue));
}
// Reflect the change in alternate views
CalendarView.UpdateAltViewCalendarColor(newValue, DisplayedOwnerKeyIndex);
// Update the CalendarModel ColorScheme
OwnerCollection owners = CalendarView.CalendarModel.Owners;
foreach (Owner owner in owners)
{
if (owner.Key.Equals(OwnerKey) == true)
{
owner.ColorScheme = newValue;
break;
}
}
}
#endregion
#region Font
///
/// Get and sets the calendar font.
///
public virtual Font Font
{
get { return (_Font); }
set
{
if (value != null && _Font.Equals(value) == false)
{
if (_Font != null)
_Font.Dispose();
if (_BoldFont != null)
_BoldFont.Dispose();
_Font = value;
_BoldFont = new Font(_Font, FontStyle.Bold);
InvalidateRect(true);
}
}
}
#endregion
#region Selection support
///
/// Gets and sets the currently selected CalendarItem
///
public CalendarItem SelectedItem
{
get { return _SelectedItem; }
set
{
if (_SelectedItem != value)
{
CalendarItem oldValue = _SelectedItem;
_SelectedItem = value;
if (value != null)
{
CalendarView.DateSelectionStart = null;
CalendarView.DateSelectionEnd = null;
DateSelectionAnchor = null;
UpdateItemOrder(value);
}
SetSelectedItem(oldValue, value);
OnSelectedItemChanged(oldValue, value);
}
}
}
internal void UpdateItemOrder(CalendarItem ci)
{
int n = SubItems.IndexOf(ci);
int index = FirstCalendarItem();
if (index >= 0 && index < n)
{
SubItems._RemoveAt(n);
SubItems._Insert(index, ci);
}
}
private int FirstCalendarItem()
{
for (int i = 0; i < SubItems.Count; i++)
{
if (SubItems[i] is CalendarItem)
return (i);
}
return (-1);
}
///
/// SelectedItemChanged event propagation
///
protected virtual void
OnSelectedItemChanged(CalendarItem oldValue, CalendarItem newValue)
{
if (SelectedItemChanged != null)
{
SelectedItemChanged(this,
new SelectedItemChangedEventArgs(oldValue, newValue));
}
}
///
/// Gets the selected state of the view
///
public bool IsViewSelected
{
get { return (_IsViewSelected); }
internal set {_IsViewSelected = value; }
}
#endregion
#region SelectedAppointments
///
/// Gets a ReadOnlyCollection of the
/// currently selected appointments for the view
///
public ReadOnlyCollection SelectedAppointments
{
get
{
List apps = new List();
AppointmentView view = _SelectedItem as AppointmentView;
if (view != null)
apps.Add(view);
return (new ReadOnlyCollection(apps));
}
}
#endregion
#endregion
#region Protected properties
#region CalendarModel
///
/// Gets the View CalendarModel
///
protected CalendarModel CalendarModel
{
get { return (CalendarView.CalendarModel); }
}
#endregion
#region Mouse related properties
///
/// IsMouseDown
///
protected bool IsMouseDown
{
get { return (_IsMouseDown); }
set { _IsMouseDown = value; }
}
///
/// IsStartResizing
///
protected bool IsStartResizing
{
get { return (_IsStartResizing); }
set { _IsStartResizing = value; }
}
///
/// IsEndResizing
///
protected bool IsEndResizing
{
get { return (_IsEndResizing); }
set { _IsEndResizing = value; }
}
///
/// IsResizing
///
protected bool IsResizing
{
get { return (_IsStartResizing || _IsEndResizing); }
}
///
/// IsMoving
///
protected bool IsMoving
{
get { return (_IsMoving); }
set { _IsMoving = value; }
}
///
/// IsTabMoving
///
protected bool IsTabMoving
{
get { return (_IsTabMoving); }
set { _IsTabMoving = value; }
}
///
/// IsConMoving
///
protected bool IsCondMoving
{
get { return (_IsCondMoving); }
set { _IsCondMoving = value; }
}
///
/// CanDrag
///
protected bool CanDrag
{
get { return (SelectedItem != null && CalendarView.EnableDragDrop == true); }
}
///
/// Pre-move/resize StartTime
///
protected DateTime OldStartTime
{
get { return (_oldStartTime); }
set { _oldStartTime = value; }
}
///
/// Pre-move/resize EndTime
///
protected DateTime OldEndTime
{
get { return (_oldEndTime); }
set { _oldEndTime = value; }
}
#endregion
#region Cursor properties
///
/// Sets local view cursor
///
protected Cursor MyCursor
{
set { CalendarView.ViewCursor = value; }
}
///
/// Gets CalendarView default cursor
///
protected Cursor DefaultCursor
{
get { return (CalendarView.DefaultViewCursor); }
}
#endregion
#region PosWin
///
/// Gets and sets the view position window
///
protected PosWin PosWin
{
get { return (_PosWin); }
set { _PosWin = value; }
}
#endregion
#endregion
#region Internal properties
///
/// Gets the CalendarView
///
internal CalendarView CalendarView
{
get { return (_CalendarView); }
}
///
/// Gets the ECalendarView
///
internal eCalendarView ECalendarView
{
get { return (_ECalendarView); }
}
///
/// Gets and sets the ModelViewConnector
///
internal ModelViewConnector Connector
{
get { return (_Connector); }
set
{
if (value != _Connector)
{
_Connector = value;
_Connector.DisplayOwnerKey = DisplayedOwnerKey;
_Connector.Connect();
}
}
}
///
/// Gets the DayOfWeekHeader height
///
internal int DayOfWeekHeaderHeight
{
get { return (Font.Height + 4); }
}
///
/// IsCopyDrag
///
internal bool IsCopyDrag
{
get { return (_IsCopyDrag); }
set { _IsCopyDrag = value; }
}
///
/// IsNewCopyDrag
///
internal bool IsNewCopyDrag
{
get { return (_IsNewCopyDrag); }
set { _IsNewCopyDrag = value; }
}
///
/// OldOwnerKey
///
internal string OldOwnerKey
{
get { return (_oldOwnerKey); }
set { _oldOwnerKey = value; }
}
#region MonthHeaderHeight
internal int MonthHeaderHeight
{
get { return (Font.Height + 4); }
}
#endregion
///
/// Gets the MultiUserTabHeight
///
internal int MultiUserTabHeight
{
get { return (_CalendarView.MultiUserTabHeight); }
}
///
/// Gets the MultiUserTabWidth
///
internal int MultiUserTabWidth
{
get { return (_CalendarView.TimeLineMultiUserTabWidth); }
}
///
/// Gets the Appointment height
///
internal int AppointmentHeight
{
get { return (Font.Height + 4); }
}
///
/// Gets and sets the date selection anchor
///
internal DateTime? DateSelectionAnchor
{
get { return (_DateSelectionAnchor); }
set { _DateSelectionAnchor = value; }
}
///
/// Gets and sets the Days of the week object
///
internal DaysOfTheWeek DaysOfTheWeek
{
get { return (_DaysOfTheWeek); }
set { _DaysOfTheWeek = value; }
}
///
/// Gets and sets the selecting status
///
internal bool IsSelecting
{
get { return (_IsSelecting); }
set { _IsSelecting = value; }
}
///
/// Gets and sets recalc layout need
///
internal bool NeedRecalcLayout
{
get { return (_NeedRecalcLayout); }
set
{
_NeedRecalcLayout = value;
if (value == true)
InvalidateRect(true);
}
}
///
/// Gets and sets the view client rectangle
///
internal Rectangle ClientRect
{
get { return (_ClientRect); }
set { _ClientRect = value; }
}
///
/// Gets and sets the DateRangeChanged state
///
internal bool DateRangeChanged
{
get { return (_DateRangeChanged); }
set { _DateRangeChanged = value; }
}
///
/// Gets and sets the base non-client data
///
internal NonClientData NClientData
{
get { return (_NClientData); }
set { _NClientData = value; }
}
#endregion
#region HookEvents
///
/// Hooks and unhooks our object events
///
/// True - hook, false - unhook
private void HookEvents(bool hook)
{
if (hook == true)
{
CalendarView.ModelChanged += CalendarViewModelChanged;
CalendarView.DateSelectionStartChanged += CalendarViewDateSelectionStartChanged;
CalendarView.DateSelectionEndChanged += CalendarViewDateSelectionEndChanged;
}
else
{
CalendarView.ModelChanged -= CalendarViewModelChanged;
CalendarView.DateSelectionStartChanged -= CalendarViewDateSelectionStartChanged;
CalendarView.DateSelectionEndChanged -= CalendarViewDateSelectionEndChanged;
}
}
#endregion
#region Event processing
///
/// DateSelectionEndChanged
///
///
///
void CalendarViewDateSelectionEndChanged(object sender, DateSelectionEventArgs e)
{
if (CalendarView.SelectedOwnerIndex == DisplayedOwnerKeyIndex)
this.DateSelectionEnd = CalendarView.DateSelectionEnd;
else
this.DateSelectionEnd = null;
}
///
/// DateSelectionStartChanged
///
///
///
void CalendarViewDateSelectionStartChanged(object sender, DateSelectionEventArgs e)
{
if (CalendarView.SelectedOwnerIndex == DisplayedOwnerKeyIndex)
this.DateSelectionStart = CalendarView.DateSelectionStart;
else
this.DateSelectionStart = null;
}
///
/// ModelChanged
///
///
///
void CalendarViewModelChanged(object sender, ModelEventArgs e)
{
ResetView();
}
#endregion
#region RecalcSize
///
/// Performs NeedRecalcSize requests
///
public override void RecalcSize()
{
base.RecalcSize();
Rectangle r = Bounds;
if (CalendarView.IsMultiCalendar == true)
{
if (NClientData.TabOrientation == eTabOrientation.Horizontal)
{
r.Inflate(-2, -2);
if (CalendarView.ShowTabs == true)
{
r.Y += MultiUserTabHeight;
r.Height -= MultiUserTabHeight;
}
}
else
{
if (CalendarView.ShowTabs == true)
{
if (CalendarView.TimeLineMultiUserTabOrientation == eOrientation.Vertical)
{
r.X += MultiUserTabHeight + Dpi.Width4;
r.Width -= (MultiUserTabHeight + Dpi.Width4);
}
else
{
r.X += MultiUserTabWidth + Dpi.Width4;
r.Width -= (MultiUserTabWidth + Dpi.Width4);
}
}
}
}
ClientRect = r;
}
#endregion
#region Paint processing
///
/// Paint processing
///
///
public override void Paint(ItemPaintArgs e)
{
if (CalendarView.IsMultiCalendar == true)
{
if (NClientData.TabOrientation == eTabOrientation.Horizontal)
DrawHorizontalLayout(e);
else
DrawVerticalLayout(e);
}
}
#region DrawHorizontalLayout
///
/// Draws horizontal tab layout
///
///
private void DrawHorizontalLayout(ItemPaintArgs e)
{
Graphics g = e.Graphics;
Rectangle r = Bounds;
r.Width = _ClientRect.Width;
r.Height = MultiUserTabHeight + 3;
if (r.Width > 0)
{
// Size-up the tab dimensions
string s = string.IsNullOrEmpty(DisplayName) ? OwnerKey : DisplayName;
Size sz = TextDrawing.MeasureString(g, s, Font);
// Draw the control background border, and tab,
DrawBackBorder(g, sz.Width);
DrawHTab(e, s, sz.Width, r);
}
}
#region DrawBackBorder
///
/// Draws the background border around
/// the entire control view
///
///
///
private void DrawBackBorder(Graphics g, int width)
{
Rectangle r = _ClientRect;
if (g.ClipBounds.X > r.X)
{
r.Width -= (int) (g.ClipBounds.X - r.X);
r.X = (int) g.ClipBounds.X + 1;
}
if (g.ClipBounds.Right < r.Right)
r.Width = (int) g.ClipBounds.Right - r.X - 1;
if (CalendarView.DoRenderViewBorder(g, this, r) == false)
{
using (Pen pen = new
Pen(_CalendarColor.GetColor(_NClientData.ContBack)))
{
g.DrawLines(pen, new Point[]
{
new Point(r.Left - 1, r.Y - 1),
new Point(r.Right, r.Top - 1),
new Point(r.Right, r.Bottom),
new Point(r.Left - 1, r.Bottom),
new Point(r.Left - 1, r.Top - 2),
new Point(r.Right, r.Top - 2),
});
}
using (Pen pen = new
Pen(_CalendarColor.GetColor(_NClientData.TabBorder)))
{
// Draw the tab border
if (width + MultiUserTabHeight < _ClientRect.Width)
{
g.DrawLine(pen,
_ClientRect.Left + width + MultiUserTabHeight, _ClientRect.Top - 2,
_ClientRect.Right + 1, _ClientRect.Top - 2);
}
g.DrawLines(pen, new Point[]
{
new Point(_ClientRect.Right + 1, _ClientRect.Top - 2),
new Point(_ClientRect.Right + 1, _ClientRect.Bottom + 1),
new Point(_ClientRect.Left - 2, _ClientRect.Bottom + 1),
new Point(_ClientRect.Left - 2, _ClientRect.Top - 2),
});
}
}
}
#endregion
#region DrawHTab
///
/// Draws the tab - border and content
///
/// ItemPaintArgs
/// Tab text
/// Text measured width
/// Bounding rectangle
private void DrawHTab(ItemPaintArgs e, string text, int width, Rectangle r)
{
_TabWidth = Math.Min(width, _ClientRect.Width);
if (CalendarView.ShowTabs == true)
{
if (e.ClipRectangle.Y < _ClientRect.Y)
{
Graphics g = e.Graphics;
bool isSelected =
(CalendarView.SelectedOwnerIndex == DisplayedOwnerKeyIndex);
// Draw the tab
using (GraphicsPath path = GetHTabPath(_TabWidth))
{
if (CalendarView.DoRenderTabBackground(g, path, this, isSelected) == false)
{
using (Brush br = _CalendarColor.BrushPart(
isSelected ? _NClientData.TabSelBack : _NClientData.TabBack, r))
{
g.FillPath(br, path);
}
using (Pen pen = new
Pen(_CalendarColor.GetColor(_NClientData.TabBorder)))
{
g.DrawPath(pen, path);
}
}
// Draw the tab text
if (CalendarView.DoRenderTabContent(
g, path, this, ref text, isSelected) == false)
{
r.X += 4;
Color color = _CalendarColor.GetColor(isSelected
? _NClientData.TabSelFore : _NClientData.TabFore);
TextDrawing.DrawString(g, text, Font, color, r, eTextFormat.VerticalCenter);
}
}
}
}
}
#endregion
#region GetHTabPath
///
/// Gets the tab graphics path
///
/// Tab width
/// GraphicsPath
protected GraphicsPath GetHTabPath(int tabWidth)
{
GraphicsPath path = new GraphicsPath();
Rectangle r = ClientRect;
r.Width = tabWidth;
r.Height = MultiUserTabHeight;
path.AddLine(ClientRect.Left - 2, ClientRect.Top - 2,
ClientRect.Left - 2, Bounds.Top + TabRadius);
path.AddArc(ClientRect.Left - 2, Bounds.Y, TabDia, TabDia, 180, 90);
if (tabWidth + MultiUserTabHeight < ClientRect.Width)
{
// Full tab
path.AddLines(new Point[] {
new Point(ClientRect.Left - 2 + TabRadius, Bounds.Top),
new Point(ClientRect.Left + tabWidth, Bounds.Top),
new Point(ClientRect.Left + tabWidth + MultiUserTabHeight, ClientRect.Top - 2) });
}
else if (tabWidth < ClientRect.Width)
{
// Partial tab with end slant
int n = ClientRect.Width - tabWidth + 2;
path.AddLines(new Point[] {
new Point(ClientRect.Left - 2 + TabRadius, Bounds.Top),
new Point(ClientRect.Left + tabWidth, Bounds.Top),
new Point(ClientRect.Left - 2 + tabWidth + n, Bounds.Top + n),
new Point(ClientRect.Left - 2 + tabWidth + n, ClientRect.Top - 2) });
}
else
{
// partial tab with no end slant
path.AddLines(new Point[] {
new Point(ClientRect.Left - 2 + TabRadius, Bounds.Top),
new Point(ClientRect.Right + 1, Bounds.Top),
new Point(ClientRect.Right + 1, ClientRect.Top - 2) });
}
return (path);
}
#endregion
#endregion
#region DrawVerticalLayout
///
/// Draws vertical tab layout
///
///
private void DrawVerticalLayout(ItemPaintArgs e)
{
if (CalendarView.ShowTabs == true)
{
Rectangle r = ClientRect;
if (r.Height > 0)
{
if (CalendarView.TimeLineMultiUserTabOrientation == eOrientation.Vertical)
{
r.X -= MultiUserTabHeight;
r.Width = MultiUserTabHeight;
DrawVTab(e, string.IsNullOrEmpty(DisplayName)
? OwnerKey
: DisplayName, r);
}
else
{
r.X -= MultiUserTabWidth;
r.Width = MultiUserTabWidth;
DrawVTab2(e, string.IsNullOrEmpty(DisplayName)
? OwnerKey
: DisplayName, r);
}
}
}
}
#region DrawVTab
///
/// Draws the tab - border and content
///
/// ItemPaintArgs
/// Tab text
/// Bounding rectangle
private void DrawVTab(ItemPaintArgs e, string text, Rectangle r)
{
if (e.ClipRectangle.X < _ClientRect.X)
{
Graphics g = e.Graphics;
_TabWidth = _ClientRect.Height - MultiUserTabHeight;
if (_TabWidth < MultiUserTabHeight)
_TabWidth = Math.Min(MultiUserTabHeight, Math.Max(0, _ClientRect.Height - 4));
bool isSelected = CalendarView.SelectedOwnerIndex == DisplayedOwnerKeyIndex;
using (GraphicsPath path = GetVTabPath(_TabWidth))
{
// Draw the tab
if (CalendarView.DoRenderTabBackground(g, path, this, isSelected) == false)
{
using (Brush br = _CalendarColor.BrushPart(
isSelected ? _NClientData.TabSelBack : _NClientData.TabBack, r))
{
g.FillPath(br, path);
}
using (Pen pen = new
Pen(_CalendarColor.GetColor(_NClientData.TabBorder)))
{
g.DrawPath(pen, path);
}
}
// Draw the tab text
if (CalendarView.DoRenderTabContent(g, path, this, ref text, isSelected) == false)
{
r.Height -= 4;
// Set uo our output to have vertically centered text
StringFormat sf = new StringFormat();
sf.FormatFlags = StringFormatFlags.NoWrap;
sf.Alignment = StringAlignment.Center;
// Calc our rect origin and prepare to
// output the SideBar text
PointF ptf = new PointF(r.X, r.Bottom);
Rectangle rf = new Rectangle(0, 0, _TabWidth, MultiUserTabHeight);
g.TranslateTransform(ptf.X, ptf.Y);
g.RotateTransform(-90);
using (Brush br = _CalendarColor.BrushPart(
isSelected ? _NClientData.TabSelFore : _NClientData.TabFore, rf))
{
g.DrawString(text, Font, br, rf, sf);
}
g.ResetTransform();
}
}
}
}
#endregion
#region GetVTabPath
///
/// Gets the tab graphics path
///
/// Tab width
/// GraphicsPath
protected GraphicsPath GetVTabPath(int tabWidth)
{
GraphicsPath path = new GraphicsPath();
Rectangle r = ClientRect;
r.X -= (MultiUserTabHeight + 1);
r.Width = MultiUserTabHeight;
path.AddLine(r.Right, r.Bottom - 1,
r.X + TabRadius, r.Bottom - 1);
path.AddArc(r.X, r.Bottom - 1 - TabDia, TabDia, TabDia, 90, 90);
if (r.Height > MultiUserTabHeight * 2)
{
// Full tab
path.AddLines(new Point[] {
new Point(r.X, r.Bottom - TabRadius),
new Point(r.X, r.Bottom - tabWidth),
new Point(r.Right, r.Bottom - tabWidth - MultiUserTabHeight) });
}
else if (r.Height > MultiUserTabHeight)
{
// Partial tab with end slant
int n = r.Height - MultiUserTabHeight;
path.AddLines(new Point[] {
new Point(r.X, r.Bottom - TabRadius),
new Point(r.X, r.Top + n),
new Point(r.X + n, r.Y),
new Point(r.Right, r.Y) });
}
else
{
// partial tab with no end slant
path.AddLines(new Point[] {
new Point(r.X, Bounds.Bottom - TabRadius),
new Point(r.X, Bounds.Top),
new Point(r.X + MultiUserTabHeight, Bounds.Top) });
}
return (path);
}
#endregion
#region DrawVTab2
///
/// Draws the tab - border and content
///
/// ItemPaintArgs
/// Tab text
/// Bounding rectangle
private void DrawVTab2(ItemPaintArgs e, string text, Rectangle r)
{
if (e.ClipRectangle.X < _ClientRect.X)
{
Graphics g = e.Graphics;
_TabWidth = _ClientRect.Width - MultiUserTabWidth;
if (_TabWidth < MultiUserTabWidth)
_TabWidth = Math.Min(MultiUserTabWidth, Math.Max(0, _ClientRect.Width - 4));
bool isSelected = CalendarView.SelectedOwnerIndex == DisplayedOwnerKeyIndex;
using (GraphicsPath path = GetVTab2Path(_TabWidth))
{
// Draw the tab
if (CalendarView.DoRenderTabBackground(g, path, this, isSelected) == false)
{
using (Brush br = _CalendarColor.BrushPart(
isSelected ? _NClientData.TabSelBack : _NClientData.TabBack, r))
{
g.FillPath(br, path);
}
using (Pen pen = new
Pen(_CalendarColor.GetColor(_NClientData.TabBorder)))
{
g.DrawPath(pen, path);
}
}
// Draw the tab text
if (CalendarView.DoRenderTabContent(g, path, this, ref text, isSelected) == false)
{
r.Y += 2;
r.Height -= 4;
// Set uo our output to have vertically centered text
StringFormat sf = new StringFormat();
sf.FormatFlags = StringFormatFlags.NoWrap;
sf.Alignment = StringAlignment.Center;
sf.LineAlignment = StringAlignment.Center;
// Calc our rect origin and prepare to
// output the SideBar text
using (Brush br = _CalendarColor.BrushPart(
isSelected ? _NClientData.TabSelFore : _NClientData.TabFore, r))
{
g.DrawString(text, Font, br, r, sf);
}
}
}
}
}
#endregion
#region GetVTab2Path
///
/// Gets the tab graphics path
///
/// Tab width
/// GraphicsPath
protected GraphicsPath GetVTab2Path(int tabWidth)
{
GraphicsPath path = new GraphicsPath();
Rectangle r = ClientRect;
r.X -= (MultiUserTabWidth + 1);
r.Width = MultiUserTabWidth;
path.AddLine(r.Right, r.Bottom - 1,
r.X + TabRadius, r.Bottom - 1);
path.AddArc(r.X, r.Bottom - 1 - TabDia, TabDia, TabDia, 90, 90);
path.AddArc(r.X, r.Top, TabDia, TabDia, 180, 90);
path.AddLine(r.Right, r.Top, r.Right, r.Bottom - 1);
path.CloseFigure();
return (path);
}
#endregion
#endregion
#endregion
#region GetTabPath
///
/// Gets the multiuser tab path
///
///
///
GraphicsPath GetTabPath(int tabWidth)
{
if (NClientData.TabOrientation == eTabOrientation.Horizontal)
return (GetHTabPath(tabWidth));
if (CalendarView.TimeLineMultiUserTabOrientation == eOrientation.Horizontal)
return (GetVTab2Path(tabWidth));
return (GetVTabPath(tabWidth));
}
#endregion
#region PointInTab
///
/// Determines if the given Point is
/// within the View tab area
///
/// Point in question
/// true if the Point is in the tab
private bool PointInTab(Point pt)
{
bool isInTab = false;
if (CalendarView.IsMultiCalendar == true)
{
if (NClientData.TabOrientation == eTabOrientation.Horizontal)
{
if (pt.Y < ClientRect.Y)
{
using (GraphicsPath path = GetHTabPath(_TabWidth))
{
if (path.IsVisible(pt) == true)
isInTab = true;
}
}
}
else
{
if (pt.X < ClientRect.X)
{
if (CalendarView.TimeLineMultiUserTabOrientation == eOrientation.Vertical)
{
using (GraphicsPath path = GetVTabPath(_TabWidth))
{
if (path.IsVisible(pt) == true)
isInTab = true;
}
}
else
{
using (GraphicsPath path = GetVTab2Path(_TabWidth))
{
if (path.IsVisible(pt) == true)
isInTab = true;
}
}
}
}
}
return (isInTab);
}
#endregion
#region Mouse support
#region InternalMouseDown
///
/// MouseDown processing
///
/// MouseEventArgs
public override void InternalMouseDown(MouseEventArgs objArg)
{
// Pass the event on through
base.InternalMouseDown(objArg);
// Check to see if the use is attempting to reorder
// the view via MouseDown in the view tab
Point pt = objArg.Location;
if (PointInTab(pt) == true)
{
SelectedItem = null;
_CalendarView.SelectedOwnerIndex = DisplayedOwnerKeyIndex;
if (objArg.Button == MouseButtons.Left)
{
if (CalendarView.AllowTabReorder && CalendarView.DisplayedOwners.Count > 1)
{
_IsTabMoving = true;
_LastViewIndex = CalendarView.GetViewIndexFromPoint(pt);
}
}
}
else if (pt.Y >= ClientRect.Y)
{
_CalendarView.SelectedOwnerIndex = DisplayedOwnerKeyIndex;
}
IsNewCopyDrag = false;
}
#endregion
#region InternalMouseMove
///
/// MouseMove processing
///
///
public override void InternalMouseMove(MouseEventArgs objArg)
{
// Pass the event on through
base.InternalMouseMove(objArg);
// If the user has initiated a tab reorder, then
// track the tab movement
if (_IsTabMoving == true)
{
Point pt = objArg.Location;
int viewIndex = CalendarView.GetViewIndexFromPoint(pt);
// If the user has dragged the tab to another view location
// then reorder the tabs accordingly
if (viewIndex >= 0 && viewIndex != _LastViewIndex)
{
CalendarView.ReorderViews(_LastViewIndex, viewIndex);
_LastViewIndex = viewIndex;
}
MyCursor = Cursors.SizeAll;
}
}
#endregion
#region InternalMouseUp
///
/// MouseUp processing
///
///
public override void InternalMouseUp(MouseEventArgs objArg)
{
base.InternalMouseUp(objArg);
// Hide our PosWindow if it is visible
if (_PosWin != null)
_PosWin.Hide();
if (SelectedItem != null)
{
// DoAppointmentViewChanged
if (IsMoving == true)
{
if (TimeChanged(SelectedItem) == true || OwnerChanged() == true ||
IsCopyDrag == true || IsNewCopyDrag == true)
{
DoViewChanged(SelectedItem, eViewOperation.AppointmentMove);
}
}
else if (IsResizing == true)
{
if (TimeChanged(SelectedItem) == true)
DoViewChanged(SelectedItem, eViewOperation.AppointmentResize);
}
}
// Reset our mouse states
ClearMouseStates();
}
private bool TimeChanged(CalendarItem item)
{
return (item.StartTime != _oldStartTime || item.EndTime != _oldEndTime);
}
private bool OwnerChanged()
{
if (OwnerKey != null)
return (OwnerKey.Equals(_oldOwnerKey) == false);
return (false);
}
private void DoViewChanged(CalendarItem item, eViewOperation eop)
{
if (item.StartTime != _oldStartTime)
UpdateReminders(item, _oldStartTime);
CalendarView.DoAppointmentViewChanged(item, _oldOwnerKey, _oldStartTime, _oldEndTime, eop, _IsNewCopyDrag);
}
///
/// Clears all mouse related state flags
///
protected void ClearMouseStates()
{
_IsMouseDown = false;
_IsMoving = false;
_IsStartResizing = false;
_IsEndResizing = false;
_IsTabMoving = false;
_IsCondMoving = false;
_IsCopyDrag = false;
}
#endregion
#endregion
#region DragItem
///
/// Initiates dragging of a copy of the
/// current selectedItem - if the ctrl-key is pressed
///
///
protected bool DragCopy()
{
if (CalendarView.EnableDragCopy == true)
{
if (IsCopyDrag == false && IsNewCopyDrag == false &&
(Control.ModifierKeys & Keys.Control) == Keys.Control)
{
AppointmentView av = SelectedItem as AppointmentView;
if (av != null)
{
Appointment ap = av.Appointment.Copy();
CalendarModel.Appointments.Add(ap);
IsNewCopyDrag = true;
return (true);
}
}
}
return (false);
}
#endregion
#region UpdateReminders
///
/// Updates associated appointment reminders
/// after an appointment has been moved
///
protected void UpdateReminders(CalendarItem item, DateTime oldStartTime)
{
//AppointmentView view = item as AppointmentView;
//if (view != null)
//{
// ReminderCollection rc = view.Appointment.Reminders;
// if (rc != null && rc.Count > 0)
// {
// TimeSpan ts = item.StartTime - oldStartTime;
// for (int i = 0; i < rc.Count; i++)
// rc[i].ReminderTime = rc[i].ReminderTime.Add(ts);
// }
//}
}
#endregion
#region GetViewAreaFromPoint
///
/// Gets the view area under the given mouse
/// point (tab, header, content, etc)
///
/// Point
/// eViewArea
public virtual eViewArea GetViewAreaFromPoint(Point pt)
{
if (Bounds.Contains(pt) == true)
{
if (NClientData.TabOrientation == eTabOrientation.Horizontal)
{
if (pt.Y < ClientRect.Y)
{
using (GraphicsPath path = GetTabPath(_TabWidth))
{
if (path.IsVisible(pt) == true)
return (eViewArea.InTab);
}
}
}
else
{
if (pt.X < ClientRect.X)
{
using (GraphicsPath path = GetTabPath(_TabWidth))
{
if (path.IsVisible(pt) == true)
return (eViewArea.InTab);
}
}
}
}
return (eViewArea.NotInView);
}
#endregion
#region GetDateSelectionFromPoint
///
/// Gets the date selection from the given point. The startDate
/// and endDate will vary based upon the view type (WeekDay / Month)
///
/// Point in question
/// out start date
/// out end date
/// True if a valid selection exists
/// at the given point
public virtual bool GetDateSelectionFromPoint(
Point pt, out DateTime startDate, out DateTime endDate)
{
startDate = new DateTime();
endDate = new DateTime();
return (false);
}
#endregion
#region GetAppointmentView
///
/// Gets the appointment view created for an appointment in this view
///
/// The appointment
/// Reference to AppointmentView or null if no view is found
public virtual AppointmentView GetAppointmentView(Appointment appointment)
{
for (int i = 0; i < SubItems.Count; i++)
{
AppointmentView view = SubItems[i] as AppointmentView;
if (view != null)
{
if (view.Appointment == appointment)
return (view);
}
}
return (null);
}
#endregion
#region GetAppointmentViewFromPoint
///
/// Gets the appointment view created for an appointment in this view
///
/// The appointment
/// Reference to AppointmentView or null if no view is found
public virtual AppointmentView GetAppointmentViewFromPoint(Point pt)
{
for (int i = 0; i < SubItems.Count; i++)
{
AppointmentView view = SubItems[i] as AppointmentView;
if (view != null)
{
if (view.Bounds.Contains(pt))
return (view);
}
}
return (null);
}
#endregion
#region CustomCalendarItem
///
/// Gets the CustomCalendarItem created for this view
///
/// Reference to CustomCalendarItem or null if none found
public virtual CustomCalendarItem GetCustomCalendarItem(CustomCalendarItem item)
{
if (item.BaseCalendarItem != null)
item = item.BaseCalendarItem;
for (int i = 0; i < SubItems.Count; i++)
{
CustomCalendarItem view = SubItems[i] as CustomCalendarItem;
if (view != null)
{
if (view == item || view.BaseCalendarItem == item)
return (view);
}
}
return (null);
}
#endregion
#region Invalidate routines
///
/// Invalidates the given rectangle
///
internal void InvalidateRect()
{
InvalidateRect(ClientRect, false);
}
///
/// Invalidates the entire calendar
/// bounding rect area
///
/// NeedRecalcSize flag
internal void InvalidateRect(bool needRecalc)
{
InvalidateRect(ClientRect, needRecalc);
}
///
/// Invalidates the entire calendar
/// bounding rect area
///
internal void InvalidateRect(Rectangle rect)
{
InvalidateRect(rect, false);
}
///
/// Invalidates the given rectangle
///
/// Rectangle to invalidate
/// NeedRecalcSize flag
internal void InvalidateRect(Rectangle rect, bool needRecalc)
{
Control c = (Control)this.GetContainerControl(true);
if (c != null)
{
rect.Height += 0;
rect.Width += 0;
if (rect.Bottom >= ClientRect.Bottom)
rect.Width += 0;
c.Invalidate(rect);
}
if (needRecalc == true)
this.NeedRecalcSize = true;
}
#endregion
#region ResetView
///
/// Disconnects and resets the Model connection
///
internal virtual void ResetView()
{
if (_Connector != null)
{
// Disconnect the Model
_Connector.Disconnect();
_Connector = null;
// Reset our selected item
SelectedItem = null;
}
DateRangeChanged = false;
NeedRecalcLayout = true;
NeedRecalcSize = true;
}
#endregion
#region ReloadView
internal void ReloadView()
{
if (CalendarModel != null)
{
CalendarModel.BeginUpdate();
CalendarModel.EndUpdate();
}
}
#endregion
#region SetSelectedItem
///
/// Sets the current selected item
///
/// Previously selected CalendarItem
/// New CalendarItem to select
/// Base selected CalendarItem
protected virtual CalendarItem SetSelectedItem(CalendarItem pci, CalendarItem nci)
{
return (null);
}
#endregion
#region UpdateDateSelection
///
/// Updates each monthWeeks DayRects to reflect
/// the date selection start and end values
///
protected virtual void UpdateDateSelection()
{
}
internal void SetDateSelection(DateTime dateStart, DateTime dateEnd)
{
UpdateDateSelection();
}
#endregion
#region AutoSyncViewDate
///
/// AutoSync our view start date
///
///
protected void AutoSyncViewDate(eCalendarView syncView)
{
if (CalendarView.AutoSyncViewDates == true)
{
if (CalendarView.AutoSyncDate != DateTime.MinValue)
{
DateTime syncDate = CalendarView.AutoSyncDate;
CalendarView.ShowViewDate(this.ECalendarView, syncDate);
CalendarView.AutoSyncDate = syncDate;
}
}
}
#endregion
#region ExtendSelection
///
/// Extends the selection if the shift-key
/// is pressed with selection
///
///
///
protected void ExtendSelection(ref DateTime startDate, ref DateTime endDate)
{
if (DateSelectionAnchor.HasValue == false ||
((Control.ModifierKeys & Keys.Shift) != Keys.Shift))
{
DateSelectionAnchor = startDate;
}
else
{
if (DateSelectionAnchor < startDate)
startDate = DateSelectionAnchor.Value;
else
{
DateTime anchorEnd = DateSelectionAnchor.Value.Add(endDate - startDate);
if (anchorEnd > endDate)
endDate = anchorEnd;
}
}
CalendarView.AutoSyncDate = startDate;
}
#endregion
#region ValidDateSelection
protected bool ValidDateSelection()
{
if (DateSelectionStart.HasValue && DateSelectionEnd.HasValue)
{
if (DateSelectionAnchor.HasValue == false)
DateSelectionAnchor = DateSelectionStart;
return (DateSelectionStart <= DateSelectionEnd);
}
return (false);
}
#endregion
#region PosWindow support
///
/// Pos window update
///
protected void UpdatePosWin(Rectangle viewRect)
{
if (IsStartResizing || IsEndResizing || IsMoving)
{
// Only display if the Alt key is pressed
if ((Control.ModifierKeys & Keys.Alt) == Keys.Alt)
{
// Allocate our pos window if not
// previously allocated
if (PosWin == null)
{
PosWin = new PosWin(this);
PosWin.Size = new Size(1, 1);
Control c = (Control)this.GetContainerControl(true);
if (c != null)
PosWin.Owner = c.FindForm();
}
PosWin.UpdateWin(viewRect);
}
else
{
if (PosWin != null)
PosWin.Hide();
}
}
}
#endregion
#region GetIndicatorRect
internal virtual Rectangle GetIndicatorRect(TimeIndicator ti)
{
return (Rectangle.Empty);
}
internal virtual Rectangle GetIndicatorRect(TimeIndicator ti, DateTime time)
{
return (Rectangle.Empty);
}
#endregion
#region InternalKeyUp
internal virtual void InternalKeyUp(KeyEventArgs e)
{
}
#endregion
#region Copy implementation
///
/// Returns copy of the item.
///
public override BaseItem Copy()
{
BaseView objCopy = new BaseView(_CalendarView, _ECalendarView);
CopyToItem(objCopy);
return (objCopy);
}
///
/// Copies the BaseView specific properties to new instance of the item.
///
/// New BaseView instance
protected override void CopyToItem(BaseItem copy)
{
BaseView objCopy = copy as BaseView;
if (objCopy != null)
{
base.CopyToItem(objCopy);
objCopy._DateSelectionStart = this._DateSelectionStart;
objCopy._DateSelectionEnd = this._DateSelectionEnd;
objCopy._DisplayName = this._DisplayName;
objCopy._EndDate = this._EndDate;
objCopy._StartDate = this._StartDate;
}
}
#endregion
#region IDisposable Members
protected override void Dispose(bool disposing)
{
if (disposing == true && IsDisposed == false)
{
ResetView();
HookEvents(false);
}
base.Dispose(disposing);
}
#endregion
}
#region enums
public enum eViewArea
{
NotInView,
InTab,
InContent,
InAllDayPanel,
InDayOfWeekHeader,
InWeekHeader,
InSideBarPanel,
InIntervalHeader,
InPeriodHeader,
InCondensedView,
InMonthHeader
}
public enum eTabOrientation
{
Vertical,
Horizontal,
}
#endregion
#region EventsArgs
///
/// SelectedItemChangedEventArgs
///
public class SelectedItemChangedEventArgs : ValueChangedEventArgs
{
public SelectedItemChangedEventArgs(CalendarItem oldValue, CalendarItem newValue)
: base(oldValue, newValue)
{
}
}
///
/// CalendarColorChangedEventArgs
///
public class CalendarColorChangedEventArgs : ValueChangedEventArgs
{
public CalendarColorChangedEventArgs(eCalendarColor oldValue, eCalendarColor newValue)
: base(oldValue, newValue)
{
}
}
#endregion
}
#endif