528 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			528 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| #if FRAMEWORK20
 | |
| using System;
 | |
| using System.Drawing;
 | |
| using System.Drawing.Drawing2D;
 | |
| using System.Windows.Forms;
 | |
| using DevComponents.Schedule.Model;
 | |
| 
 | |
| namespace DevComponents.DotNetBar.Schedule
 | |
| {
 | |
|     public class AppointmentWeekDayView : AppointmentView
 | |
|     {
 | |
|         #region Private variables
 | |
| 
 | |
|         private DayColumn _DayColumn;
 | |
|         private AllDayPanel _AllDayPanel;
 | |
|         private eViewEnds _ViewEnds = eViewEnds.Complete;
 | |
| 
 | |
|         #endregion
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Constructor
 | |
|         /// </summary>
 | |
|         /// <param name="baseView"></param>
 | |
|         /// <param name="appointment"></param>
 | |
|         public AppointmentWeekDayView(BaseView baseView, Appointment appointment)
 | |
|             : base(baseView, appointment)
 | |
|         {
 | |
|             SetViewEnds();
 | |
|         }
 | |
| 
 | |
|         #region Public properties
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets and sets View DayColumn
 | |
|         /// </summary>
 | |
|         public DayColumn DayColumn
 | |
|         {
 | |
|             get { return (_DayColumn); }
 | |
|             set { _DayColumn = value; }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets and sets View AllDayPanel
 | |
|         /// </summary>
 | |
|         public AllDayPanel AllDayPanel
 | |
|         {
 | |
|             get { return (_AllDayPanel); }
 | |
| 
 | |
|             set
 | |
|             {
 | |
|                 if (_AllDayPanel != value)
 | |
|                 {
 | |
|                     _AllDayPanel = value;
 | |
| 
 | |
|                     SetViewEnds();
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         #endregion
 | |
| 
 | |
|         #region Private properties
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets the default horizontal padding
 | |
|         /// </summary>
 | |
|         private int HorizontalPadding
 | |
|         {
 | |
|             get { return (6); }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets whether the appointment is mutable
 | |
|         /// </summary> 
 | |
|         private bool IsMutable
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 WeekDayView wv = (WeekDayView)BaseView;
 | |
| 
 | |
|                 return (IsSelected == true &&
 | |
|                     wv.IsAllDayItem(this) == false &&
 | |
|                     Appointment.Locked == false &&
 | |
|                     Appointment.IsRecurringInstance == false);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         #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>
 | |
|         private void SetViewEnds()
 | |
|         {
 | |
|             if (_AllDayPanel != null)
 | |
|             {
 | |
|                 _ViewEnds = eViewEnds.Complete;
 | |
| 
 | |
|                 int col, n;
 | |
| 
 | |
|                 DateTime start = GetDateCol(StartTime, out col, out n);
 | |
|                 DateTime end = start.AddDays(n);
 | |
| 
 | |
|                 // Check to see if we can only display
 | |
|                 // a partial representation for the view
 | |
| 
 | |
|                 if (col > 0 || start > StartTime)
 | |
|                     _ViewEnds |= eViewEnds.PartialLeft;
 | |
| 
 | |
|                 TimeSpan ts = new TimeSpan(24, 0, 0);
 | |
| 
 | |
|                 if (end > EndTime || EndTime - end > ts)
 | |
|                     _ViewEnds |= eViewEnds.PartialRight;
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 _ViewEnds = eViewEnds.PartialLeft | eViewEnds.PartialRight;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets the initial starting DayColumn col and max col
 | |
|         /// for the given date
 | |
|         /// </summary>
 | |
|         /// <param name="selDate">Selection date</param>
 | |
|         /// <param name="col">Column</param>
 | |
|         /// <param name="n">Max col</param>
 | |
|         /// <returns></returns>
 | |
|         private DateTime GetDateCol(DateTime selDate, out int col, out int n)
 | |
|         {
 | |
|             DayColumn[] dayColumns = _AllDayPanel.WeekDayView.DayColumns;
 | |
| 
 | |
|             // Loop through each column
 | |
| 
 | |
|             col = 0;
 | |
|             n = 0;
 | |
| 
 | |
|             for (int i = 0; i < dayColumns.Length; i++)
 | |
|             {
 | |
|                 DateTime date = dayColumns[i].Date;
 | |
| 
 | |
|                 // If we have found our containing column, then
 | |
|                 // calculate the absolute slice value and return it
 | |
| 
 | |
|                 if (date.Year >= selDate.Year ||
 | |
|                     date.Month >= selDate.Month || date.Day >= selDate.Day)
 | |
|                 {
 | |
|                     col = i;
 | |
|                     n = dayColumns.Length - col - 1;
 | |
| 
 | |
|                     return (date);
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             return (selDate);
 | |
|         }
 | |
| 
 | |
|         #endregion
 | |
| 
 | |
|         #region Appointment rendering
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Paint processing
 | |
|         /// </summary>
 | |
|         /// <param name="e">ItemPaintArgs</param>
 | |
|         public override void Paint(ItemPaintArgs e)
 | |
|         {
 | |
|             AppointmentColor.SetColorTable();
 | |
| 
 | |
|             Rectangle r = GetViewRect();
 | |
| 
 | |
|             if (r.Width > 1 && r.Height > 0)
 | |
|             {
 | |
|                 if (EffectiveStyle == eDotNetBarStyle.Office2010 || StyleManager.IsMetro(EffectiveStyle))
 | |
|                     DrawMetroAppointment(e, r);
 | |
|                 else
 | |
|                     DrawDefaultAppointment(e, r);
 | |
| 
 | |
|                 if (IsMutable == true)
 | |
|                     DrawResizeHandles(e, r);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         #region DrawDefaultAppointment
 | |
| 
 | |
|         private void DrawDefaultAppointment(ItemPaintArgs e, Rectangle r)
 | |
|         {
 | |
|             Graphics g = e.Graphics;
 | |
| 
 | |
|             int top = Math.Min(Math.Min(r.Width / 2, r.Height / 2), 5);
 | |
|             int bot = top;
 | |
| 
 | |
|             if (DayColumn != null)
 | |
|             {
 | |
|                 if (StartTime.Date < DayColumn.Date.Date)
 | |
|                     top = 0;
 | |
| 
 | |
|                 if (EndTime.Date > DayColumn.Date.Date.AddDays(1))
 | |
|                     bot = 0;
 | |
|             }
 | |
| 
 | |
|             using (GraphicsPath path = DisplayHelp.GetRoundedRectanglePath(r, top, top, bot, bot))
 | |
|             {
 | |
|                 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(g, top, bot, r, path);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         #region DrawDefaultBorder
 | |
| 
 | |
|         private void DrawDefaultBorder(Graphics g,
 | |
|             int top, int bot, Rectangle r, GraphicsPath path)
 | |
|         {
 | |
|             DrawTimeMarker(g, r, top);
 | |
| 
 | |
|             if (IsSelected == true)
 | |
|             {
 | |
|                 using (Pen pen = SelectedBorderPen)
 | |
|                     g.DrawPath(pen, path);
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 using (Pen pen = BorderPen)
 | |
|                     g.DrawPath(pen, path);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         #endregion
 | |
| 
 | |
|         #endregion
 | |
| 
 | |
|         #region DrawMetroAppointment
 | |
| 
 | |
|         private void DrawMetroAppointment(ItemPaintArgs e, Rectangle r)
 | |
|         {
 | |
|             Graphics g = e.Graphics;
 | |
| 
 | |
|             using (Brush br = BackBrush(r))
 | |
|                 g.FillRectangle(br, r);
 | |
| 
 | |
|             if (BaseView.CalendarView.DoAppointmentViewPreRender(this, g, r, null) == false)
 | |
|             {
 | |
|                 DrawContent(e, r);
 | |
| 
 | |
|                 BaseView.CalendarView.DoAppointmentViewPostRender(this, g, r, null);
 | |
|             }
 | |
| 
 | |
|             DrawMetroBorder(g, r);
 | |
|         }
 | |
| 
 | |
|         #region DrawMetroBorder
 | |
| 
 | |
|         private void DrawMetroBorder(Graphics g, Rectangle r)
 | |
|         {
 | |
|             DrawTimeMarker(g, r, 0);
 | |
| 
 | |
|             if (IsSelected == true)
 | |
|             {
 | |
|                 using (Pen pen = new Pen(Color.Black, 2))
 | |
|                     g.DrawRectangle(pen, r);
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 using (Pen pen = BorderPen)
 | |
|                     g.DrawRectangle(pen, r);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         #endregion
 | |
| 
 | |
|         #endregion
 | |
| 
 | |
|         #region GetViewRect
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets the view rect for the appointment
 | |
|         /// </summary>
 | |
|         /// <returns>View rect</returns>
 | |
|         private Rectangle GetViewRect()
 | |
|         {
 | |
|             Rectangle r = DisplayRectangle;
 | |
| 
 | |
|             if ((_ViewEnds & eViewEnds.PartialLeft) != eViewEnds.PartialLeft)
 | |
|             {
 | |
|                 r.X += HorizontalPadding;
 | |
|                 r.Width -= HorizontalPadding;
 | |
|             }
 | |
| 
 | |
|             if ((_ViewEnds & eViewEnds.PartialRight) != eViewEnds.PartialRight)
 | |
|                 r.Width -= HorizontalPadding;
 | |
| 
 | |
|             // If the view is selected, then allow
 | |
|             // for a thicker selection rect
 | |
| 
 | |
|             if (IsSelected == true && Appointment.IsMultiDayOrAllDayEvent == false)
 | |
|                 r.Height -= 1;
 | |
| 
 | |
|             return (r);
 | |
|         }
 | |
| 
 | |
|         #endregion
 | |
| 
 | |
|         #region DrawContent
 | |
| 
 | |
|         /// <summary>
 | |
|         /// DrawContent
 | |
|         /// </summary>
 | |
|         /// <param name="e"></param>
 | |
|         /// <param name="r"></param>
 | |
|         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>
 | |
|         /// Draws the content text
 | |
|         /// </summary>
 | |
|         /// <param name="e"></param>
 | |
|         /// <param name="r"></param>
 | |
|         private void DrawContentText(ItemPaintArgs e, Rectangle r)
 | |
|         {
 | |
|             Graphics g = e.Graphics;
 | |
| 
 | |
|             if (DisplayTemplateText(e, r) == false)
 | |
|             {
 | |
|                 string s = Appointment.Subject;
 | |
| 
 | |
|                 eTextFormat tf = eTextFormat.NoPadding | eTextFormat.NoPrefix;
 | |
|                 WeekDayView wv = BaseView as WeekDayView;
 | |
| 
 | |
|                 if (wv != null && wv.IsAllDayItem(Appointment) == false)
 | |
|                 {
 | |
|                     s += "\n" + Appointment.Description;
 | |
| 
 | |
|                     r.Y += 3;
 | |
|                     r.Height -= 3;
 | |
| 
 | |
|                     tf |= eTextFormat.WordBreak;
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     tf |= eTextFormat.VerticalCenter;
 | |
|                 }
 | |
| 
 | |
|                 Font font = Font ?? e.Font;
 | |
| 
 | |
|                 if (r.Width > 4)
 | |
|                     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 DrawResizeHandles
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Draws the resize handles for the view
 | |
|         /// </summary>
 | |
|         /// <param name="e"></param>
 | |
|         /// <param name="r">View rectangle</param>
 | |
|         private void DrawResizeHandles(ItemPaintArgs e, Rectangle r)
 | |
|         {
 | |
|             if (r.Width > 6)
 | |
|             {
 | |
|                 Graphics g = e.Graphics;
 | |
| 
 | |
|                 Rectangle r2 =
 | |
|                     new Rectangle(r.X + (r.Width / 2) - 2, r.Y - 3, 5, 5);
 | |
| 
 | |
|                 if (DayColumn != null)
 | |
|                 {
 | |
|                     // Top handle
 | |
| 
 | |
|                     if (StartTime >= DayColumn.Date)
 | |
|                     {
 | |
|                         g.FillRectangle(Brushes.White, r2);
 | |
|                         g.DrawRectangle(Pens.Black, r2);
 | |
|                     }
 | |
| 
 | |
|                     // Bottom handle
 | |
| 
 | |
|                     if (EndTime <= DayColumn.Date.AddDays(1))
 | |
|                     {
 | |
|                         r2.Y = r.Bottom - 2;
 | |
| 
 | |
|                         g.FillRectangle(Brushes.White, r2);
 | |
|                         g.DrawRectangle(Pens.Black, r2);
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         #endregion
 | |
| 
 | |
|         #endregion
 | |
| 
 | |
|         #region Mouse processing
 | |
| 
 | |
|         #region MouseMove 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>eHitArea</returns>
 | |
|         private eHitArea GetHitArea(MouseEventArgs objArg)
 | |
|         {
 | |
|             if (IsMutable == true)
 | |
|             {
 | |
|                 Rectangle r = GetViewRect();
 | |
| 
 | |
|                 Rectangle r2 =
 | |
|                     new Rectangle(r.X + (r.Width / 2) - 7, r.Y - 7, 14, 14);
 | |
| 
 | |
|                 if (DayColumn != null)
 | |
|                 {
 | |
|                     // See if we are in the top resize area
 | |
| 
 | |
|                     if (StartTime >= DayColumn.Date)
 | |
|                     {
 | |
|                         if (r2.Contains(objArg.Location))
 | |
|                             return (eHitArea.TopResize);
 | |
|                     }
 | |
| 
 | |
|                     // See if we are in the bottom resize area
 | |
| 
 | |
|                     if (EndTime <= DayColumn.Date.AddDays(1))
 | |
|                     {
 | |
|                         r2.Y = r.Bottom - 10;
 | |
| 
 | |
|                         if (r2.Contains(objArg.Location))
 | |
|                             return (eHitArea.BottomResize);
 | |
|                     }
 | |
|                 }
 | |
| 
 | |
|                 // By default we are in the move area
 | |
| 
 | |
|                 return (eHitArea.Move);
 | |
|             }
 | |
| 
 | |
|             // No valid area to report
 | |
| 
 | |
|             return (eHitArea.None);
 | |
|         }
 | |
| 
 | |
|         #endregion
 | |
| 
 | |
|         #endregion
 | |
| 
 | |
|     }
 | |
| }
 | |
| #endif
 | |
| 
 |