/// <summary> /// Gets the button for the day that is under the provided point. /// </summary> /// <param name="pt">Point to lookup.</param> /// <param name="exact">Exact requires that the day must be with the month range.</param> /// <returns>DateTime for matching day; otherwise null.</returns> public DateTime?DayFromPoint(Point pt, bool exact) { // Get the bottom most view element matching the point ViewBase view = ViewFromPoint(pt); // Climb view hierarchy looking for the days view while (view != null) { ViewDrawMonthDays month = view as ViewDrawMonthDays; if ((month != null) && month.ClientRectangle.Contains(pt)) { return(month.DayFromPoint(pt, exact)); } view = view.Parent; } return(null); }
/// <summary> /// Initialize a new instance of the ViewDrawMonth class. /// </summary> /// <param name="calendar">Reference to calendar provider.</param> /// <param name="months">Reference to months instance.</param> /// <param name="redirector">Redirector for getting values.</param> /// <param name="needPaintDelegate">Delegate for requesting paint changes.</param> public ViewDrawMonth(IKryptonMonthCalendar calendar, ViewLayoutMonths months, PaletteRedirect redirector, NeedPaintHandler needPaintDelegate) : base(false) { _calendar = calendar; _months = months; // Add a header for showing the month/year value _drawContent = new ViewDrawContent(_calendar.StateNormal.Header.Content, this, VisualOrientation.Top); _borderForced = new PaletteBorderInheritForced(_calendar.StateNormal.Header.Border); _borderForced.ForceBorderEdges(PaletteDrawBorders.None); _drawHeader = new ViewDrawDocker(_calendar.StateNormal.Header.Back, _borderForced, null); _drawHeader.Add(_drawContent, ViewDockStyle.Fill); Add(_drawHeader); // Create the left/right arrows for moving the months _arrowPrev = new ButtonSpecCalendar(this, PaletteButtonSpecStyle.Previous, RelativeEdgeAlign.Near); _arrowNext = new ButtonSpecCalendar(this, PaletteButtonSpecStyle.Next, RelativeEdgeAlign.Far); _arrowPrev.Click += new EventHandler(OnPrevMonth); _arrowNext.Click += new EventHandler(OnNextMonth); _buttonSpecs = new CalendarButtonSpecCollection(this); _buttonSpecs.Add(_arrowPrev); _buttonSpecs.Add(_arrowNext); // Using a button spec manager to add the buttons to the header _buttonManager = new ButtonSpecManagerDraw(_calendar.CalendarControl, redirector, null, _buttonSpecs, new ViewDrawDocker[] { _drawHeader }, new IPaletteMetric[] { _calendar.StateCommon }, new PaletteMetricInt[] { PaletteMetricInt.HeaderButtonEdgeInsetCalendar }, new PaletteMetricPadding[] { PaletteMetricPadding.None }, _calendar.GetToolStripDelegate, needPaintDelegate); // Create stacks for holding display items ViewLayoutStack namesStack = new ViewLayoutStack(true); ViewLayoutStack weeksStack = new ViewLayoutStack(true); ViewLayoutStack daysStack = new ViewLayoutStack(false); _numberStack = new ViewLayoutStack(false); weeksStack.Add(_numberStack); weeksStack.Add(daysStack); // Add day names _drawMonthDayNames = new ViewDrawMonthDayNames(_calendar, _months); _drawWeekCorner = new ViewLayoutWeekCorner(_calendar, _months, _calendar.StateNormal.Header.Border); namesStack.Add(_drawWeekCorner); namesStack.Add(_drawMonthDayNames); Add(namesStack); Add(weeksStack); // Add border between week numbers and days area _borderEdgeRedirect = new PaletteBorderEdgeRedirect(_calendar.StateNormal.Header.Border, null); _borderEdge = new PaletteBorderEdge(_borderEdgeRedirect, null); _drawBorderEdge = new ViewDrawBorderEdge(_borderEdge, Orientation.Vertical); _drawWeekNumbers = new ViewDrawWeekNumbers(_calendar, _months); ViewLayoutDocker borderLeftDock = new ViewLayoutDocker(); borderLeftDock.Add(_drawWeekNumbers, ViewDockStyle.Left); borderLeftDock.Add(new ViewLayoutSeparator(0, 4), ViewDockStyle.Top); borderLeftDock.Add(_drawBorderEdge, ViewDockStyle.Fill); borderLeftDock.Add(new ViewLayoutSeparator(0, 4), ViewDockStyle.Bottom); _numberStack.Add(borderLeftDock); // Add border between day names and individual days PaletteBorderEdgeRedirect borderEdgeRedirect = new PaletteBorderEdgeRedirect(_calendar.StateNormal.Header.Border, null); PaletteBorderEdge borderEdge = new PaletteBorderEdge(borderEdgeRedirect, null); ViewDrawBorderEdge drawBorderEdge = new ViewDrawBorderEdge(borderEdge, Orientation.Horizontal); ViewLayoutDocker borderTopDock = new ViewLayoutDocker(); borderTopDock.Add(new ViewLayoutSeparator(4, 1), ViewDockStyle.Left); borderTopDock.Add(drawBorderEdge, ViewDockStyle.Fill); borderTopDock.Add(new ViewLayoutSeparator(4, 1), ViewDockStyle.Right); borderTopDock.Add(new ViewLayoutSeparator(1, 3), ViewDockStyle.Bottom); daysStack.Add(borderTopDock); // Add the actual individual days _drawMonthDays = new ViewDrawMonthDays(_calendar, _months); daysStack.Add(_drawMonthDays); // Adding buttons manually means we have to ask for buttons to be created _buttonManager.RecreateButtons(); }