/// <summary> /// Initialize a new instance of the ButtonSpecCalendar class. /// </summary> /// <param name="month">Reference to owning view.</param> /// <param name="fixedStyle">Fixed style to use.</param> /// <param name="edge">Alignment edge.</param> public ButtonSpecCalendar(ViewDrawMonth month, PaletteButtonSpecStyle fixedStyle, RelativeEdgeAlign edge) { Debug.Assert(month != null); // Remember back reference to owning navigator. _month = month; _edge = edge; _enabled = true; _visible = true; // Fix the type ProtectedType = fixedStyle; }
/// <summary> /// Gets the button for the day that is nearest (date wise) to the point provided. /// </summary> /// <param name="pt">Point to lookup.</param> /// <returns>DateTime for nearest matching day.</returns> public DateTime DayNearPoint(Point pt) { // Search for an exact matching month view foreach (ViewBase view in this) { ViewDrawMonth month = view as ViewDrawMonth; if ((month != null) && month.ClientRectangle.Contains(pt)) { return(month.ViewDrawMonthDays.DayNearPoint(pt)); } } int cols = _calendar.CalendarDimensions.Width; int rows = _calendar.CalendarDimensions.Height; int ptCol = cols - 1; int ptRow = rows - 1; // Find the column to be used in lookup for (int col = 0; col < cols; col++) { if (pt.X < this[col + 1].ClientRectangle.Right) { ptCol = col; break; } } // Find the row to be used in lookup for (int row = 0; row < rows; row++) { if (pt.Y < this[(row * cols) + 1].ClientRectangle.Bottom) { ptRow = row; break; } } ViewDrawMonth target = ((ViewDrawMonth)this[(ptCol + (ptRow * cols)) + 1]); return(target.ViewDrawMonthDays.DayNearPoint(pt)); }
/// <summary> /// Initialize a new instance of the CalendarButtonSpecCollection class. /// </summary> /// <param name="owner">Reference to owning object.</param> public CalendarButtonSpecCollection(ViewDrawMonth owner) : base(owner) { }
private void SyncMonths() { // We need the today header if we show the today button or a button spec this[0].Visible = _showToday || (_buttonSpecs.Count > 0); this[0].Enabled = Enabled; _drawToday.Visible = _showToday; // How many month children instances do we need? int months = Months; // Do we need to create more month view? if (Count < (months + 1)) { for (int i = Count - 1; i < months; i++) { Add(new ViewDrawMonth(_calendar, this, _redirector, _needPaintDelegate)); } } else if (Count > (months + 1)) { // Remove excess month view instances for (int i = Count - 1; i > months; i--) { this[i].Dispose(); this.RemoveAt(i); } } // Is there a change in the selection range? if ((_oldSelectionStart != _calendar.SelectionStart) || (_oldSelectionEnd != _calendar.SelectionEnd) || (_oldFocusDay != FocusDay) || _firstTimeSync) { _firstTimeSync = false; _oldSelectionStart = _calendar.SelectionStart; _oldSelectionEnd = _calendar.SelectionEnd; _oldFocusDay = FocusDay; // If we have a day with the focus if (FocusDay != null) { // If focus day is before the first month if (FocusDay.Value < _displayMonth) { _displayMonth = new DateTime(FocusDay.Value.Year, FocusDay.Value.Month, 1); } else { // If focus day is after the last month DateTime endDate = _displayMonth.AddMonths(months); if (FocusDay.Value >= endDate) { _displayMonth = new DateTime(FocusDay.Value.Year, FocusDay.Value.Month, 1).AddMonths(-(months - 1)); } } } else { // Bring the selection into the display range DateTime endMonth = _displayMonth.AddMonths(months - 1); DateTime oldSelEndDate = _oldSelectionEnd.Date; DateTime oldSelEndMonth = new DateTime(oldSelEndDate.Year, oldSelEndDate.Month, 1); if (oldSelEndMonth >= endMonth) { _displayMonth = oldSelEndMonth.AddMonths(-(months - 1)); } if (_oldSelectionStart < _displayMonth) { _displayMonth = new DateTime(_calendar.SelectionStart.Year, _calendar.SelectionStart.Month, 1); } } } DateTime currentMonth = _displayMonth; // Inform each view which month it should be drawing for (int i = 1; i < Count; i++) { ViewDrawMonth viewMonth = (ViewDrawMonth)this[i]; viewMonth.Enabled = Enabled; viewMonth.Month = currentMonth; viewMonth.FirstMonth = (i == 1); viewMonth.LastMonth = (i == (Count - 1)); viewMonth.UpdateButtons((i == 1), ((i - 1) == (_calendar.CalendarDimensions.Width - 1))); // Move forward to next month currentMonth = currentMonth.AddMonths(1); } }