private void UpdateProgramView() { try { timeView.ClearInfo(); weekDayView.ClearInfo(); epgProgramView.ClearInfo(); timeList.Clear(); programList.Clear(); NowLineDelete(); dayList.Clear(); UInt64 selectID = GetSelectID(true); if (selectID == 0) { return; } //リストの作成 int idx = serviceEventList.FindIndex(item => item.serviceInfo.Create64Key() == selectID); if (idx < 0) { return; } serviceEventList[idx].eventList.ForEach(eventInfo => { //無いはずだが、ToDictionary()にせず、一応保険。 programList[eventInfo.CurrentPgUID()] = new ProgramViewItem(eventInfo); }); //日付リスト構築 dayList.AddRange(programList.Values.Select(d => GetViewDay(d.Data.start_time)).Distinct().OrderBy(day => day)); //横位置の設定 foreach (ProgramViewItem item in programList.Values) { item.Width = Settings.Instance.ServiceWidth; item.LeftPos = item.Width * dayList.BinarySearch(GetViewDay(item.Data.start_time)); } //縦位置の設定 if (viewCustNeedTimeOnly == false) { ViewUtil.AddTimeList(timeList, new DateTime(2001, 1, 1, viewInfo.StartTimeWeek, 0, 0), 86400); } SetProgramViewItemVertical(); epgProgramView.SetProgramList(programList.Values.ToList(), dayList.Count * Settings.Instance.ServiceWidth, timeList.Count * 60 * Settings.Instance.MinHeight); timeView.SetTime(timeList, true); weekDayView.SetDay(dayList); ReDrawNowLine(); } catch (Exception ex) { MessageBox.Show(ex.Message + "\r\n" + ex.StackTrace); } }
/// <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); } }
/// <summary>番組情報の再描画</summary> protected override void ReloadProgramViewItem() { try { dateView.ClearInfo(); timeView.ClearInfo(); serviceView.ClearInfo(); epgProgramView.ClearInfo(); timeList.Clear(); programList.Clear(); ReDrawNowLine(); if (serviceEventList.Count == 0) { return; } //必要番組の抽出と時間チェック var primeServiceList = new List <EpgServiceInfo>(); //番組表でまとめて描画する矩形の幅と番組集合のリスト var programGroupList = new List <PanelItem <List <ProgramViewItem> > >(); int groupSpan = 1; int mergePos = 0; int mergeNum = 0; int servicePos = -1; for (int i = 0; i < serviceEventList.Count; i++) { //TSIDが同じでSIDが逆順に登録されているときは併合する int spanCheckNum = 1; if (--mergePos < i - mergeNum) { EpgServiceInfo curr = serviceEventList[i].serviceInfo; for (mergePos = i; mergePos + 1 < serviceEventList.Count; mergePos++) { EpgServiceInfo next = serviceEventList[mergePos + 1].serviceInfo; if (next.ONID != curr.ONID || next.TSID != curr.TSID || next.SID >= curr.SID) { break; } curr = next; } mergeNum = mergePos + 1 - i; servicePos++; //正順のときは貫きチェックするサービス数を調べる for (; mergeNum == 1 && i + spanCheckNum < serviceEventList.Count; spanCheckNum++) { EpgServiceInfo next = serviceEventList[i + spanCheckNum].serviceInfo; if (next.ONID != curr.ONID || next.TSID != curr.TSID) { break; } else if (next.SID < curr.SID) { spanCheckNum--; break; } curr = next; } if (--groupSpan <= 0) { groupSpan = spanCheckNum; programGroupList.Add(new PanelItem <List <ProgramViewItem> >(new List <ProgramViewItem>()) { Width = this.EpgStyle().ServiceWidth *groupSpan }); } primeServiceList.Add(serviceEventList[mergePos].serviceInfo); } foreach (EpgEventInfo eventInfo in serviceEventList[mergePos].eventList) { //イベントグループのチェック int widthSpan = 1; if (eventInfo.EventGroupInfo != null) { //サービス2やサービス3の結合されるべきもの if (eventInfo.IsGroupMainEvent == false) { continue; } //横にどれだけ貫くかチェック int count = 1; while (mergeNum == 1 ? count < spanCheckNum : count < mergeNum - (mergeNum + i - mergePos - 1) / 2) { EpgServiceInfo nextInfo = serviceEventList[mergeNum == 1 ? i + count : mergePos - count].serviceInfo; bool findNext = false; foreach (EpgEventData data in eventInfo.EventGroupInfo.eventDataList) { if (nextInfo.Key == data.Create64Key()) { widthSpan++; findNext = true; } } if (findNext == false) { break; } count++; } } //continueが途中にあるので登録はこの位置 var viewItem = new ProgramViewItem(eventInfo) { EpgSettingIndex = viewInfo.EpgSettingIndex, Filtered = viewData.EventFilteredHash.Contains(eventInfo.CurrentPgUID()) }; viewItem.DrawHours = eventInfo.start_time != LimitedStart(eventInfo); programList[eventInfo.CurrentPgUID()] = viewItem; programGroupList.Last().Data.Add(viewItem); //横位置の設定 viewItem.Width = this.EpgStyle().ServiceWidth *widthSpan / mergeNum; viewItem.LeftPos = this.EpgStyle().ServiceWidth *(servicePos + (double)((mergeNum + i - mergePos - 1) / 2) / mergeNum); } } //縦位置の設定 if (viewCustNeedTimeOnly == false && programList.Count != 0) { ViewUtil.AddTimeList(timeList, programList.Values.Min(item => LimitedStart(item.Data)), 0); } SetProgramViewItemVertical(); epgProgramView.SetProgramList(programGroupList, timeList.Count * 60 * this.EpgStyle().MinHeight); timeView.SetTime(timeList, false); dateView.SetTime(timeList, ViewPeriod); serviceView.SetService(primeServiceList); ReDrawNowLine(); MoveNowTime(); } catch (Exception ex) { MessageBox.Show(ex.Message + "\r\n" + ex.StackTrace); } }