/// <summary> /// Informs elements who's selected and who's not, and repaints <see cref="_selectedElementSquare"/> /// </summary> private void UpdateSelectionElements() { CalendarTimeScaleUnit unitStart = _selectedElementStart as CalendarTimeScaleUnit; CalendarDayTop topStart = _selectedElementStart as CalendarDayTop; CalendarDay dayStart = _selectedElementStart as CalendarDay; CalendarTimeScaleUnit unitEnd = _selectedElementEnd as CalendarTimeScaleUnit; CalendarDayTop topEnd = _selectedElementEnd as CalendarDayTop; CalendarDay dayEnd = _selectedElementEnd as CalendarDay; ClearSelectedComponents(); if (_selectedElementEnd == null || _selectedElementStart == null) { return; } if (_selectedElementEnd.CompareTo(SelectedElementStart) < 0) { //swap unitStart = _selectedElementEnd as CalendarTimeScaleUnit; topStart = _selectedElementEnd as CalendarDayTop; dayStart = _selectedElementEnd as CalendarDay; unitEnd = SelectedElementStart as CalendarTimeScaleUnit; topEnd = SelectedElementStart as CalendarDayTop; dayEnd = _selectedElementStart as CalendarDay; } if (unitStart != null && unitEnd != null) { bool reached = false; for (int i = unitStart.Day.Index; !reached; i++) { for (int j = (i == unitStart.Day.Index ? unitStart.Index : 0); i < Days.Length && j < Days[i].TimeUnits.Length; j++) { CalendarTimeScaleUnit unit = Days[i].TimeUnits[j]; unit.SetSelected(true); GrowSquare(unit.Bounds); _selectedElements.Add(unit); if (unit.Equals(unitEnd)) { reached = true; break; } } } } else if (topStart != null && topEnd != null) { for (int i = topStart.Day.Index; i <= topEnd.Day.Index; i++) { CalendarDayTop top = Days[i].DayTop; top.SetSelected(true); GrowSquare(top.Bounds); _selectedElements.Add(top); } } else if (dayStart != null && dayEnd != null) { for (int i = dayStart.Index; i <= dayEnd.Index; i++) { CalendarDay day = Days[i]; day.SetSelected(true); GrowSquare(day.Bounds); _selectedElements.Add(day); } } InvalidateVisual(); // Invalidate(_selectedElementSquare); }