#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 /// /// Constructor /// /// /// public AppointmentWeekDayView(BaseView baseView, Appointment appointment) : base(baseView, appointment) { SetViewEnds(); } #region Public properties /// /// Gets and sets View DayColumn /// public DayColumn DayColumn { get { return (_DayColumn); } set { _DayColumn = value; } } /// /// Gets and sets View AllDayPanel /// public AllDayPanel AllDayPanel { get { return (_AllDayPanel); } set { if (_AllDayPanel != value) { _AllDayPanel = value; SetViewEnds(); } } } #endregion #region Private properties /// /// Gets the default horizontal padding /// private int HorizontalPadding { get { return (6); } } /// /// Gets whether the appointment is mutable /// 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 /// /// Handles StartTime value changes /// /// CalendarItem /// EventArgs protected override void AppointmentView_StartTimeChanged(object sender, EventArgs e) { base.AppointmentView_StartTimeChanged(sender, e); SetViewEnds(); } /// /// Handles EndTime value changes /// /// CalendarItem /// EventArgs protected override void AppointmentView_EndTimeChanged(object sender, EventArgs e) { base.AppointmentView_EndTimeChanged(sender, e); SetViewEnds(); } #endregion #region SetViewEnds /// /// Sets the view display end types /// 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; } } /// /// Gets the initial starting DayColumn col and max col /// for the given date /// /// Selection date /// Column /// Max col /// 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 /// /// Paint processing /// /// ItemPaintArgs 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 /// /// Gets the view rect for the appointment /// /// View rect 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 /// /// 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 /// /// Draws the content text /// /// /// 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 /// /// Draws the resize handles for the view /// /// /// View rectangle 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 /// /// Handles mouseDown processing /// /// MouseEventArgs public override void InternalMouseMove(MouseEventArgs objArg) { HitArea = GetHitArea(objArg); base.InternalMouseMove(objArg); } /// /// Gets the HitArea from the current /// mouse position /// /// /// eHitArea 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