예제 #1
0
        /// <summary>
        /// 予約情報の再描画
        /// </summary>
        private void ReloadReserveViewItem()
        {
            try
            {
                tunerReserveView.ClearInfo();
                tunerReserveTimeView.ClearInfo();
                tunerReserveNameView.ClearInfo();
                List <DateTime> timeList = new List <DateTime>();
                tunerList.Clear();
                reserveList.Clear();

                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);
                }

                //チューナ不足と無効予約はアイテムがなければ非表示
                var delList = tunerReserveList.Where(item => item.tunerID == 0xFFFFFFFF && item.reserveList.Count == 0).ToList();
                delList.ForEach(item => tunerReserveList.Remove(item));

                double tunerWidthSingle = Settings.Instance.TunerWidth;
                double leftPos          = 0;
                tunerReserveList.ForEach(info =>
                {
                    double tunerWidth = tunerWidthSingle;

                    var tunerAddList = new List <ReserveViewItem>();
                    foreach (UInt32 reserveID in info.reserveList)
                    {
                        ReserveData reserveInfo;
                        if (CommonManager.Instance.DB.ReserveList.TryGetValue(reserveID, out reserveInfo) == false)
                        {
                            continue;
                        }
                        var newItem = new ReserveViewItem(reserveInfo);

                        //マージンを適用
                        DateTime startTime = reserveInfo.StartTime;
                        Int32 duration     = (Int32)reserveInfo.DurationSecond;
                        ViewUtil.ApplyMarginForTunerPanelView(reserveInfo, ref startTime, ref duration);

                        newItem.Height  = duration * Settings.Instance.TunerMinHeight / 60;
                        newItem.Width   = tunerWidthSingle;
                        newItem.LeftPos = leftPos;

                        foreach (ReserveViewItem addedItem in tunerAddList)
                        {
                            ReserveData addedInfo = addedItem.ReserveInfo;

                            //マージンを適用
                            DateTime startTimeAdd = addedInfo.StartTime;
                            Int32 durationAdd     = (Int32)addedInfo.DurationSecond;
                            ViewUtil.ApplyMarginForTunerPanelView(addedInfo, ref startTimeAdd, ref durationAdd);

                            if (MenuUtil.CulcOverlapLength(startTime, (UInt32)duration, startTimeAdd, (UInt32)durationAdd) > 0)
                            {
                                if (newItem.LeftPos <= addedItem.LeftPos)
                                {
                                    if (reserveInfo.Create64Key() == addedInfo.Create64Key())
                                    {
                                        newItem.LeftPos = addedItem.LeftPos;
                                    }
                                    else
                                    {
                                        newItem.LeftPos = addedItem.LeftPos + tunerWidthSingle;
                                        if (newItem.LeftPos - leftPos >= tunerWidth)
                                        {
                                            tunerWidth += tunerWidthSingle;
                                        }
                                    }
                                }
                            }
                        }

                        reserveList.Add(newItem);
                        tunerAddList.Add(newItem);

                        //必要時間リストの構築
                        var chkStartTime = new DateTime(startTime.Year, startTime.Month, startTime.Day, startTime.Hour, 0, 0);
                        DateTime EndTime = startTime.AddSeconds(duration);
                        while (chkStartTime <= EndTime)
                        {
                            int index = timeList.BinarySearch(chkStartTime);
                            if (index < 0)
                            {
                                timeList.Insert(~index, chkStartTime);
                            }
                            chkStartTime = chkStartTime.AddHours(1);
                        }
                    }

                    tunerList.Add(new TunerNameViewItem(info, tunerWidth));
                    leftPos += tunerWidth;
                });

                //表示位置設定
                foreach (ReserveViewItem item in reserveList)
                {
                    //マージンを適用
                    DateTime startTime = item.ReserveInfo.StartTime;
                    Int32    dummy     = 0;
                    ViewUtil.ApplyMarginForTunerPanelView(item.ReserveInfo, ref startTime, ref dummy);

                    var chkStartTime = new DateTime(startTime.Year, startTime.Month, startTime.Day, startTime.Hour, 0, 0);
                    int index        = timeList.BinarySearch(chkStartTime);
                    if (index >= 0)
                    {
                        item.TopPos = (index * 60 + (startTime - chkStartTime).TotalMinutes) * Settings.Instance.TunerMinHeight;
                    }
                }

                //ごく小さいマージンの表示を抑制する。
                reserveList.ForEach(info =>
                {
                    info.TopPos = Math.Round(info.TopPos);
                    info.Height = Math.Round(info.Height);
                });

                //最低表示行数からドット数を計算する。
                // メイリオみたいに行間のあるフォントはフォントの高さをそのまま使う。
                double fontHeight = Math.Max(Settings.Instance.TunerFontHeight, Settings.Instance.TunerFontHeightService);
                // MS P ゴシックみたいな行間のないフォントは 2px あける。
                double fontSize = Math.Max(Settings.Instance.TunerFontSize, Settings.Instance.TunerFontSizeService) + 2;
                // 大きい方をフォントの高さとして採用し、最低表示px数を計算する。
                double lineHeight = Settings.Instance.TunerMinimumLine * Math.Max(fontHeight, fontSize);
                if (Settings.Instance.TunerMinimumLine >= 2)
                {
                    lineHeight += 2;                                                                        // 番組名との間隔は 2px にする
                }
                ViewUtil.ModifierMinimumHeight <ReserveData, ReserveViewItem>(reserveList, lineHeight + 2); //2ドットは枠の分

                //必要時間リストの修正。最低表示行数の適用で下に溢れた分を追加する。
                if (reserveList.Count != 0 && timeList.Count > 0)
                {
                    double bottom = reserveList.Max(info => info.TopPos + info.Height);
                    int    end    = (int)(bottom / (60 * Settings.Instance.TunerMinHeight)) + 1;
                    while (end > timeList.Count)
                    {
                        DateTime time_tail = timeList[timeList.Count - 1].AddHours(1);
                        timeList.Add(time_tail);
                    }
                }

                tunerReserveTimeView.SetTime(timeList);
                tunerReserveNameView.SetTunerInfo(tunerList);
                tunerReserveView.SetReserveList(reserveList,
                                                leftPos,
                                                timeList.Count * 60 * Settings.Instance.TunerMinHeight);
            }
            catch (Exception ex) { MessageBox.Show(ex.Message + "\r\n" + ex.StackTrace); }
        }