/// <summary> /// Возвращает данные отрисовки по ссылке на модель /// </summary> /// <param name="model">Ссылка на отрисовываемую модель</param> /// <returns>Возвращает данные отрисовки прямоугольника для модели</returns> public BarData this[LeasingElementModel model] { get { if (m_bars.ContainsKey(model)) { return(m_bars[model]); } else { return(null); } } }
double GetDayOffset(LeasingElementModel model) { if (model == null) { return(0d); } var b = model.Leasing; if (b == null) { return(0d); } var dayCount = 0; var startMonth = b.DateStart.GetMonth(); var monthes = Canvas?.LeasingSet?.Monthes; //если начало в текущем месяце if (monthes != null) { var firstMonth = monthes.ElementAt(0).Month; if (firstMonth > startMonth) //если съем начался ранее { return(0d); } else { if (firstMonth < startMonth) //если первый месяц выбранного периода начинается раньше { var prevMonth = firstMonth; //перебираем месяцы с лева на право //пока не наткнёмся на начальный месяц съёма авто do { dayCount += prevMonth.DayCount; prevMonth = prevMonth.Next(); }while (prevMonth != null && prevMonth != startMonth); } } } //по каким-то причинам не заданы месяцы или дата начала ранее начального месяца else if (b.CurrentMonth == null || b.CurrentMonth != startMonth) { return(0d); } dayCount += b.DateStart.Day - 1; //смещение слева в точках return(dayCount * DayColumnWidth + (dayCount * 1)); }
/// <summary> /// Смещение по количеству дней в предидущих месяцах /// </summary> /// <param name="barModel">Данные текущей полоски месяца</param> /// <returns>Возвращает готовой смещение по месяцу или 0</returns> double GetMonthOffset(LeasingElementModel barModel) { /* * расчёт месячного смещения * * Пример (о чём речь): * если сейчас (в переданной модели) месяц март, * а в шапке перед этим месяцем вставены ещё сколько-то месяцев * то необходимо к текущему смещению добавить ещё количество дней в этих месмяцах * * количество дней в предидущих месяцах и возвращает этот метод */ if (barModel == null) { return(0); } var offset = 0d; var monthes = Canvas.LeasingSet.Monthes; if (barModel.Monthes != null && barModel.Monthes.Length > 2) { var firstMonth = barModel.Leasing.DateStart.GetMonth(); for (int i = 0; i < monthes.Count; i++) { if (monthes[i].Month == firstMonth) { var prev = monthes[i].Previous; while (prev != null) { if (prev.Month != null) { offset += ((prev.Month.DayCount * DayColumnWidth) + prev.Month.DayCount); } prev = prev.Previous; } } } } return(offset); }
/// <summary> /// Получение строкового представления срока аренды /// </summary> /// <param name="model">Модель</param> /// <returns>Возвращает срок аренды</returns> string GetDataSpan(LeasingElementModel model) { //копипаста из BussinessDateConverter (старая версия) StringBuilder sb = new StringBuilder(); //<действие> c XX по ХХ <месяц> sb.Append("в прокате ").Append(" c "); var b = model.Leasing; if (b.MonthCount < 2) { sb.Append(b.DateStart.Day.ToString()).Append(" по ").Append(b.DateEnd.Day.ToString()).Append(" ").Append(b.DateStart.GetMonthName() ?? string.Empty); } else { sb.Append(b.DateStart.Day.ToString()).Append(" ").Append(b.DateStart.GetMonthName() ?? string.Empty).Append(" по ") .Append(b.DateEnd.Day.ToString()).Append(" ").Append(b.DateEnd.GetMonthName() ?? string.Empty); } return(sb.ToString()); }
public DrawingVisual DrawBar(LeasingElementModel barModel) { BarData bd = null; DrawingVisual dv = null; if (m_bars.ContainsKey(barModel)) { bd = m_bars[barModel]; } else { bd = new BarData(this); bd.Index = barModel.RowIndex; bd.VerticalOffset = barModel.RowIndex * RowHeight; bd.HorizontalOffset = GetDayOffset(barModel) + GetMonthOffset(barModel) + 1; bd.Model = barModel; m_bars.Add(barModel, bd); } dv = DrawBorder(bd); return(dv); }
public DrawingVisual DrawText(LeasingElementModel model) { //проверяем инициализацию для интерфейса шрифта //инициализирован при заполнении шрифта (this.FontFamily) //if (m_glyphType == null) // m_glyphType = GetGlyphTypeface(); // BarData bd = null; DrawingVisual dv = null; if (m_bars.ContainsKey(model)) { bd = m_bars[model]; } else { bd = new BarData(this) { Index = model.RowIndex, Model = model }; m_bars.Add(model, bd); SetOffset(bd); } //если ещё не проставлены смещения if (bd.Border == null) { SetOffset(bd); } dv = DrawText(bd); bd.TextDrawed = true; return(dv); }
public BarData(LeasingElementModel model) { Model = model; }
double GetWidth(LeasingElementModel model) { var dayCount = 0; //прибавляем единичку, так как при сложении/вычитании теряем день #region Вычисляем количество дней var b = model.Leasing; var periodMonthes = Canvas?.LeasingSet?.Monthes.Select(m => m.Month).ToList(); //если машину взяли/вернули в течении 1 месяца if (b.MonthCount == 1) { dayCount += ((b.DateEnd - b.DateStart).Days + 1); } //если машина взята в аренду на несколько месяцев else { var firstMonth = periodMonthes.First(); var startDate = b.DateStart; var endDate = b.DateEnd; //если съём начался за пределами первого месяца в выбранном периоде if (firstMonth > b.DateStart.GetMonth()) { startDate = firstMonth[1]; } //если съём заканчивается за последним месяцем в выбранном периоде if (periodMonthes[periodMonthes.Count - 1] < b.DateEnd.GetMonth()) { endDate = periodMonthes[periodMonthes.Count - 1].LastDate; } //получаем месяцы между датами (включительно) var monthes = Models.Month.GetMonthes(startDate, endDate); //суммируем дни в полученном периоде var lastIndex = monthes.Length - 1; var endMonth = endDate.GetMonth(); for (int i = 0; i < monthes.Length; i++) { if (i == 0) { if (startDate.Day == 1) { if (endMonth == firstMonth) { dayCount += endDate.Day; } else { dayCount += monthes[i].DayCount; } } else { dayCount += (monthes[i].DayCount - startDate.Day + 1); } } else if (i == lastIndex) { dayCount += endDate.Day; } else { dayCount += monthes[i].DayCount; } } } if (dayCount < 0) { dayCount = 0; } #endregion return((DayColumnWidth * dayCount) + dayCount); //прибавляем количество дней, т.к. ширина границ - 1 }