/// <summary> /// 予約情報の再描画 /// </summary> private void ReloadReserveViewItem() { try { tunerReserveView.ClearInfo(); tunerReserveTimeView.ClearInfo(); tunerReserveNameView.ClearInfo(); reserveList.Clear(); var tunerList = new List <PanelItem <TunerReserveInfo> >(); var timeSet = new HashSet <DateTime>(); List <TunerReserveInfo> tunerReserveList = CommonManager.Instance.DB.TunerReserveList.Values .OrderBy(info => info.tunerID).ToList();//多分大丈夫だけど一応ソートしておく if (Settings.Instance.TunerDisplayOffReserve == true) { var tuner_off = new TunerReserveInfo(); tuner_off.tunerID = 0xFFFFFFFF;//IDの表示判定に使っている tuner_off.tunerName = "無効予約"; tuner_off.reserveList = CommonManager.Instance.DB.ReserveList.Values .Where(info => info.IsEnabled == false).Select(info => info.ReserveID).ToList(); tunerReserveList.Add(tuner_off); } //チューナ不足と無効予約はアイテムがなければ非表示 tunerReserveList.RemoveAll(item => item.tunerID == 0xFFFFFFFF && item.reserveList.Count == 0); double singleWidth = Settings.Instance.TunerWidth; double leftPos = 0; var resDic = CommonManager.Instance.DB.ReserveList; tunerReserveList.ForEach(info => { var cols = new List <List <ReserveViewItem> >(); foreach (ReserveData resInfo in info.reserveList.Where(id => resDic.ContainsKey(id) == true).Select(id => resDic[id]).OrderBy(res => res.Create64Key()))//.ThenBy(res => res.StartTimeActual)) { var newItem = new TunerReserveViewItem(resInfo) { Width = singleWidth }; reserveList.Add(newItem); //横位置の設定・列を拡げて表示する処置 var addCol = cols.FindIndex(col => col.All(item => MenuUtil.CulcOverlapLength(resInfo.StartTime, resInfo.DurationSecond, item.Data.StartTime, item.Data.DurationSecond) <= 0)); if (addCol < 0) { addCol = cols.Count; cols.Add(new List <ReserveViewItem>()); } cols[addCol].Add(newItem); newItem.LeftPos = leftPos + addCol * singleWidth; //マージン込みの時間でリストを構築 ViewUtil.AddTimeList(timeSet, resInfo.StartTimeActual, resInfo.DurationActual); } double tunerWidth = singleWidth * Math.Max(1, cols.Count); tunerList.Add(new PanelItem <TunerReserveInfo>(info) { Width = tunerWidth }); leftPos += tunerWidth; }); //縦位置の設定 var timeList = new List <DateTime>(timeSet.OrderBy(time => time)); reserveList.ForEach(item => { ViewUtil.SetItemVerticalPos(timeList, item, item.Data.StartTimeActual, item.Data.DurationActual, Settings.Instance.TunerMinHeight, true); //ごく小さいマージンの表示を抑制する。 item.TopPos = Math.Round(item.TopPos); item.Height = Math.Round(item.Height); }); //最低表示行数を適用。また、最低表示高さを確保して、位置も調整する。 ViewUtil.ModifierMinimumLine(reserveList, Settings.Instance.TunerMinimumLine, Settings.Instance.TunerFontSizeService, Settings.Instance.TunerBorderTopSize); //必要時間リストの修正。最低表示行数の適用で下に溢れた分を追加する。 ViewUtil.AdjustTimeList(reserveList, timeList, Settings.Instance.TunerMinHeight); tunerReserveTimeView.SetTime(timeList, false, true); tunerReserveNameView.SetTunerInfo(tunerList); tunerReserveView.SetReserveList(reserveList, leftPos, timeList.Count * 60 * Settings.Instance.TunerMinHeight); } catch (Exception ex) { MessageBox.Show(ex.Message + "\r\n" + ex.StackTrace); } }