496 lines
13 KiB
C#
496 lines
13 KiB
C#
#if FRAMEWORK20
|
|
using System;
|
|
using DevComponents.Schedule.Model;
|
|
using System.Drawing;
|
|
using DevComponents.WinForms.Drawing;
|
|
using System.Drawing.Drawing2D;
|
|
using System.Windows.Forms;
|
|
|
|
namespace DevComponents.DotNetBar.Schedule
|
|
{
|
|
public class AppointmentHView : AppointmentView
|
|
{
|
|
#region Private variables
|
|
private eViewEnds _ViewEnds = eViewEnds.Complete;
|
|
#endregion
|
|
|
|
/// <summary>
|
|
/// Constructor
|
|
/// </summary>
|
|
/// <param name="baseView"></param>
|
|
/// <param name="appointment"></param>
|
|
public AppointmentHView(BaseView baseView, Appointment appointment)
|
|
: base(baseView, appointment)
|
|
{
|
|
}
|
|
|
|
#region Private properties
|
|
|
|
/// <summary>
|
|
/// Gets whether the appointment is mutable
|
|
/// </summary>
|
|
private bool IsMutable
|
|
{
|
|
get
|
|
{
|
|
return (IsSelected == true &&
|
|
Appointment.Locked == false &&
|
|
Appointment.IsRecurringInstance == false);
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Protected properties
|
|
|
|
protected eViewEnds ViewEnds
|
|
{
|
|
get { return (_ViewEnds); }
|
|
set { _ViewEnds = value; }
|
|
}
|
|
|
|
protected virtual Rectangle ParentBounds
|
|
{
|
|
get { return (Bounds); }
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Start/End TimeChanged event handling
|
|
|
|
/// <summary>
|
|
/// Handles StartTime value changes
|
|
/// </summary>
|
|
/// <param name="sender">CalendarItem</param>
|
|
/// <param name="e">EventArgs</param>
|
|
protected override void AppointmentView_StartTimeChanged(object sender, EventArgs e)
|
|
{
|
|
base.AppointmentView_StartTimeChanged(sender, e);
|
|
|
|
SetViewEnds();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Handles EndTime value changes
|
|
/// </summary>
|
|
/// <param name="sender">CalendarItem</param>
|
|
/// <param name="e">EventArgs</param>
|
|
protected override void AppointmentView_EndTimeChanged(object sender, EventArgs e)
|
|
{
|
|
base.AppointmentView_EndTimeChanged(sender, e);
|
|
|
|
SetViewEnds();
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region SetViewEnds
|
|
|
|
/// <summary>
|
|
/// Sets the view display end types
|
|
/// </summary>
|
|
protected virtual void SetViewEnds()
|
|
{
|
|
_ViewEnds = eViewEnds.Complete;
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Appointment rendering
|
|
|
|
/// <summary>
|
|
/// Paint processing
|
|
/// </summary>
|
|
/// <param name="e">ItemPaintArgs</param>
|
|
public override void Paint(ItemPaintArgs e)
|
|
{
|
|
SetViewEnds();
|
|
|
|
AppointmentColor.SetColorTable();
|
|
|
|
int n = (Bounds.Width < 20) ? 0 : 5;
|
|
|
|
CornerRadius cornerRadius = new CornerRadius(n);
|
|
Rectangle r = GetViewRect(ref cornerRadius);
|
|
|
|
if (r.Width > 1 && r.Height > 0)
|
|
{
|
|
if (EffectiveStyle == eDotNetBarStyle.Office2010 || StyleManager.IsMetro(EffectiveStyle))
|
|
DrawMetroAppointment(e, r);
|
|
else
|
|
DrawDefaultAppointment(e, r, n, cornerRadius);
|
|
|
|
if (IsMutable == true)
|
|
DrawGribits(e, r);
|
|
}
|
|
}
|
|
|
|
#region DrawMetroAppointment
|
|
|
|
private void DrawMetroAppointment(ItemPaintArgs e, Rectangle r)
|
|
{
|
|
Graphics g = e.Graphics;
|
|
|
|
using (Brush br = BackBrush(r))
|
|
e.Graphics.FillRectangle(br, r);
|
|
|
|
if (BaseView.CalendarView.DoAppointmentViewPreRender(this, g, r, null) == false)
|
|
{
|
|
DrawContent(e, r);
|
|
|
|
BaseView.CalendarView.DoAppointmentViewPostRender(this, g, r, null);
|
|
}
|
|
|
|
DrawMetroBorder(e, r);
|
|
}
|
|
|
|
#region DrawMetroBorder
|
|
|
|
private void DrawMetroBorder(ItemPaintArgs e, Rectangle r)
|
|
{
|
|
Graphics g = e.Graphics;
|
|
|
|
if ((_ViewEnds & eViewEnds.PartialLeft) != eViewEnds.PartialLeft)
|
|
{
|
|
if (r.Width > 10)
|
|
DrawTimeMarker(g, r, 0);
|
|
}
|
|
|
|
if (IsSelected == true)
|
|
{
|
|
if (r.Width > 10)
|
|
{
|
|
using (Pen pen = new Pen(Color.Black, 2))
|
|
g.DrawRectangle(pen, r);
|
|
}
|
|
else
|
|
{
|
|
g.DrawRectangle(Pens.Black, r);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
using (Pen pen = BorderPen)
|
|
g.DrawRectangle(pen, r);
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#endregion
|
|
|
|
#region DrawDefaultAppointment
|
|
|
|
private void DrawDefaultAppointment(ItemPaintArgs e,
|
|
Rectangle r, int n, CornerRadius cornerRadius)
|
|
{
|
|
Graphics g = e.Graphics;
|
|
|
|
using (GraphicsPath path = GetItemPath(r, n * 2, cornerRadius))
|
|
{
|
|
using (Brush br = BackBrush(r))
|
|
g.FillPath(br, path);
|
|
|
|
if (BaseView.CalendarView.DoAppointmentViewPreRender(this, g, r, path) == false)
|
|
{
|
|
DrawContent(e, r);
|
|
|
|
BaseView.CalendarView.DoAppointmentViewPostRender(this, g, r, path);
|
|
}
|
|
|
|
DrawDefaultBorder(e, r, path, n);
|
|
}
|
|
}
|
|
|
|
#region DrawDefaultBorder
|
|
|
|
private void DrawDefaultBorder(ItemPaintArgs e,
|
|
Rectangle r, GraphicsPath path, int n)
|
|
{
|
|
Graphics g = e.Graphics;
|
|
|
|
if ((_ViewEnds & eViewEnds.PartialLeft) != eViewEnds.PartialLeft)
|
|
{
|
|
if (r.Width > 10)
|
|
DrawTimeMarker(g, r, n);
|
|
}
|
|
|
|
if (IsSelected == true)
|
|
{
|
|
if (r.Width > 10)
|
|
{
|
|
using (Pen pen = SelectedBorderPen)
|
|
g.DrawPath(pen, path);
|
|
}
|
|
else
|
|
{
|
|
g.DrawPath(Pens.Black, path);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
using (Pen pen = BorderPen)
|
|
g.DrawPath(pen, path);
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#endregion
|
|
|
|
#region DrawContent
|
|
|
|
private void DrawContent(ItemPaintArgs e, Rectangle r)
|
|
{
|
|
Image image = Image;
|
|
|
|
Rectangle rText = r;
|
|
rText.X += 4;
|
|
rText.Width -= 6;
|
|
|
|
if (Appointment.TimeMarkedAs != null)
|
|
{
|
|
rText.X += 4;
|
|
rText.Width -= 4;
|
|
}
|
|
|
|
Rectangle rImage = GetItemBounds(rText, ref rText, image);
|
|
|
|
DrawContentImage(e, r, rImage, image);
|
|
DrawContentText(e, rText);
|
|
}
|
|
|
|
#region DrawContentText
|
|
|
|
/// <summary>
|
|
/// DrawContentText
|
|
/// </summary>
|
|
/// <param name="e"></param>
|
|
/// <param name="r"></param>
|
|
private void DrawContentText(ItemPaintArgs e, Rectangle r)
|
|
{
|
|
Graphics g = e.Graphics;
|
|
|
|
// Format the appointment text
|
|
|
|
if (DisplayTemplateText(e, r) == false)
|
|
{
|
|
string s = (Appointment.IsMultiDayOrAllDayEvent)
|
|
? Appointment.Subject
|
|
: String.Format("{0} {1}", Appointment.StartTime.ToShortTimeString(), Appointment.Subject);
|
|
|
|
// Output the appointment text and
|
|
// appropriately weighted bounding path
|
|
|
|
Font font = Font ?? e.Font;
|
|
const eTextFormat tf = eTextFormat.VerticalCenter |
|
|
eTextFormat.EndEllipsis | eTextFormat.NoPadding | eTextFormat.NoPrefix;
|
|
|
|
if (r.Width > 10)
|
|
TextDrawing.DrawString(g, s, font, TextColor, r, tf);
|
|
|
|
Size size = TextDrawing.MeasureString(g, s, font, r.Width, tf);
|
|
|
|
IsTextClipped = (r.Width < size.Width || r.Height < size.Height);
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#endregion
|
|
|
|
#region GetViewRect
|
|
|
|
/// <summary>
|
|
/// Gets the view rect for the appointment
|
|
/// </summary>
|
|
/// <param name="cornerRadius">Corner radius</param>
|
|
/// <returns>View rect</returns>
|
|
private Rectangle GetViewRect(ref CornerRadius cornerRadius)
|
|
{
|
|
Rectangle r = DisplayRectangle;
|
|
|
|
r.Intersect(ParentBounds);
|
|
|
|
if (r.Left == ParentBounds.Left)
|
|
{
|
|
r.X++;
|
|
r.Width--;
|
|
}
|
|
|
|
if ((_ViewEnds & eViewEnds.PartialLeft) == eViewEnds.PartialLeft)
|
|
cornerRadius.TopLeft = cornerRadius.BottomLeft = 0;
|
|
|
|
if ((_ViewEnds & eViewEnds.PartialRight) == eViewEnds.PartialRight)
|
|
cornerRadius.TopRight = cornerRadius.BottomRight = 0;
|
|
|
|
// If the view is selected, then allow
|
|
// for a thicker selection rect
|
|
|
|
if (IsSelected == true)
|
|
r.Height--;
|
|
|
|
return (r);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region GetItemPath
|
|
|
|
/// <summary>
|
|
/// Gets a path defining the item
|
|
/// </summary>
|
|
/// <param name="viewRect"></param>
|
|
/// <param name="radius"></param>
|
|
/// <param name="cornerRadius"></param>
|
|
/// <returns></returns>
|
|
private GraphicsPath GetItemPath(Rectangle viewRect, int radius, CornerRadius cornerRadius)
|
|
{
|
|
GraphicsPath path = new GraphicsPath();
|
|
|
|
Rectangle r = viewRect;
|
|
|
|
Rectangle ar = new
|
|
Rectangle(r.Right - radius, r.Bottom - radius, radius, radius);
|
|
|
|
if (cornerRadius.BottomRight > 0)
|
|
path.AddArc(ar, 0, 90);
|
|
else
|
|
path.AddLine(r.Right, r.Bottom, r.Right, r.Bottom);
|
|
|
|
ar.X = r.X;
|
|
|
|
if (cornerRadius.BottomLeft > 0)
|
|
path.AddArc(ar, 90, 90);
|
|
else
|
|
path.AddLine(r.Left, r.Bottom, r.Left, r.Bottom);
|
|
|
|
ar.Y = r.Y;
|
|
|
|
if (cornerRadius.TopLeft > 0)
|
|
path.AddArc(ar, 180, 90);
|
|
else
|
|
path.AddLine(r.Left, r.Top, r.Left, r.Top);
|
|
|
|
ar.X = r.Right - radius;
|
|
|
|
if (cornerRadius.TopRight > 0)
|
|
path.AddArc(ar, 270, 90);
|
|
else
|
|
path.AddLine(r.Right, r.Top, r.Right, r.Top);
|
|
|
|
path.CloseAllFigures();
|
|
|
|
return (path);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region DrawGribits
|
|
|
|
/// <summary>
|
|
/// Draws the resize gribits for the view
|
|
/// </summary>
|
|
/// <param name="e"></param>
|
|
/// <param name="r">View rectangle</param>
|
|
private void DrawGribits(ItemPaintArgs e, Rectangle r)
|
|
{
|
|
if (r.Width >= 8)
|
|
{
|
|
Graphics g = e.Graphics;
|
|
|
|
Rectangle r2 =
|
|
new Rectangle(r.X, r.Y + (r.Height / 2) - 2, 5, 5);
|
|
|
|
// Left gribit
|
|
|
|
if ((_ViewEnds & eViewEnds.PartialLeft) == 0)
|
|
{
|
|
r2.X = r.X - 3;
|
|
|
|
g.FillRectangle(Brushes.White, r2);
|
|
g.DrawRectangle(Pens.Black, r2);
|
|
}
|
|
|
|
// Right gribit
|
|
|
|
if ((_ViewEnds & eViewEnds.PartialRight) == 0)
|
|
{
|
|
r2.X = r.Right - 2;
|
|
|
|
g.FillRectangle(Brushes.White, r2);
|
|
g.DrawRectangle(Pens.Black, r2);
|
|
}
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#endregion
|
|
|
|
#region Mouse processing
|
|
|
|
/// <summary>
|
|
/// Handles mouseDown processing
|
|
/// </summary>
|
|
/// <param name="objArg">MouseEventArgs</param>
|
|
public override void InternalMouseMove(MouseEventArgs objArg)
|
|
{
|
|
HitArea = GetHitArea(objArg);
|
|
|
|
base.InternalMouseMove(objArg);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets the HitArea from the current
|
|
/// mouse position
|
|
/// </summary>
|
|
/// <param name="objArg"></param>
|
|
/// <returns></returns>
|
|
private eHitArea GetHitArea(MouseEventArgs objArg)
|
|
{
|
|
if (IsMutable == true)
|
|
{
|
|
CornerRadius cornerRadius = new CornerRadius(5);
|
|
Rectangle r = GetViewRect(ref cornerRadius);
|
|
|
|
//if (r.Width > 10)
|
|
{
|
|
Rectangle r2 =
|
|
new Rectangle(r.X, r.Y + (r.Height / 2) - 2, 5, 5);
|
|
|
|
if ((_ViewEnds & eViewEnds.PartialLeft) == 0)
|
|
{
|
|
r2.X = r.X - 3;
|
|
|
|
r2.Inflate(2, 2);
|
|
|
|
if (r2.Contains(objArg.Location))
|
|
return (eHitArea.LeftResize);
|
|
}
|
|
|
|
if ((_ViewEnds & eViewEnds.PartialRight) == 0)
|
|
{
|
|
r2.X = r.Right - 2;
|
|
|
|
r2.Inflate(2, 2);
|
|
|
|
if (r2.Contains(objArg.Location))
|
|
return (eHitArea.RightResize);
|
|
}
|
|
}
|
|
|
|
// By default we are in the move area
|
|
|
|
return (eHitArea.Move);
|
|
}
|
|
|
|
return (eHitArea.None);
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
}
|
|
#endif
|
|
|