OSDN Git Service

予約ダイアログに裏番組情報のグラフィカル表示を追加
[tainavi/TinyBannavi.git] / TinyBannavi / src / tainavi / AbsPaperView.java
index 75bdcbb..543ad7e 100644 (file)
@@ -19,7 +19,6 @@ import java.io.File;
 import java.util.ArrayList;\r
 import java.util.Calendar;\r
 import java.util.GregorianCalendar;\r
-import java.util.HashMap;\r
 import java.util.regex.Matcher;\r
 import java.util.regex.Pattern;\r
 \r
@@ -49,18 +48,19 @@ import tainavi.TVProgram.ProgType;
 import tainavi.TVProgramIterator.IterationType;\r
 import tainavi.VWMainWindow.MWinTab;\r
 \r
+\r
 /**\r
  * 新聞形式タブのクラス\r
  * @since 3.15.4β {@link Viewer}から分離\r
  */\r
-public abstract class AbsPaperView extends JPanel implements VWTimerRiseListener {\r
+public abstract class AbsPaperView extends JPanel implements TickTimerListener,HDDRecorderListener {\r
 \r
        private static final long serialVersionUID = 1L;\r
 \r
        public static String getViewName() { return "新聞形式"; }\r
        \r
-       //public void setDebug(boolean b) { debug = b; }\r
-       //private static boolean debug = false;\r
+       public void setDebug(boolean b) { debug = b; }\r
+       private static boolean debug = false;\r
        \r
        \r
        /*******************************************************************************\r
@@ -100,7 +100,7 @@ public abstract class AbsPaperView extends JPanel implements VWTimerRiseListener
        protected abstract void showPopupForTraceProgram(\r
                        final JComponent comp,\r
                        final ProgDetailList tvd, final String keyword, final int threshold,\r
-                       final int x, final int y, final int h\r
+                       final int x, final int y, final String clickedDateTime\r
                        );\r
 \r
        /**\r
@@ -116,7 +116,6 @@ public abstract class AbsPaperView extends JPanel implements VWTimerRiseListener
        protected abstract boolean isTabSelected(MWinTab tab);\r
        protected abstract void setSelectedTab(MWinTab tab);\r
 \r
-       protected abstract String getSelectedRecorderOnToolbar();\r
        protected abstract boolean isFullScreen();\r
        /**\r
         * ページャーコンボボックスを更新してほしい\r
@@ -179,6 +178,9 @@ public abstract class AbsPaperView extends JPanel implements VWTimerRiseListener
        private static final String TreeExpRegFile_Paper = "env"+File.separator+"tree_expand_paper.xml";\r
        \r
        private static final int TIMEBAR_START = Viewer.TIMEBAR_START;\r
+\r
+       //\r
+       private static final String TUNERLABEL_PICKUP = "PICKUP";\r
        \r
        // 定数ではないが\r
        \r
@@ -313,6 +315,39 @@ public abstract class AbsPaperView extends JPanel implements VWTimerRiseListener
        }\r
        \r
        /**\r
+        * ツールバーから過去ログへのジャンプ\r
+        */\r
+       public boolean jumpToPassed(String passed) {\r
+               \r
+               // ページャーは効くよ\r
+               if ( env.isPagerEnabled() ) {\r
+                       setPagerEnabled(true);\r
+               }\r
+               \r
+               // タイマーは止める\r
+               stopTimer();\r
+               \r
+               GregorianCalendar c = CommonUtils.getCalendar(passed);\r
+               String adate = CommonUtils.getDate(c);\r
+               \r
+               // 指定日付に移動して放送局の位置を確認する\r
+               TVProgramIterator pli = redrawByDateWithCenter(null,adate);\r
+               if ( pli == null ) {\r
+                       // どちらにもない\r
+                       MWin.appendError(ERRID+"ジャンプ先の日付がみつかりません: "+adate);\r
+                       ringBeep();\r
+                       return false;\r
+               }\r
+               \r
+               // 新聞形式に移動\r
+               if ( ! isTabSelected(MWinTab.PAPER) ) {\r
+                       setSelectedTab(MWinTab.PAPER);\r
+               }\r
+               \r
+               return true;\r
+       }\r
+       \r
+       /**\r
         * リスト形式・本体予約一覧からの目的の番組へジャンプ\r
         */\r
        public boolean jumpToBangumi(String center, String startdt) {\r
@@ -327,10 +362,13 @@ public abstract class AbsPaperView extends JPanel implements VWTimerRiseListener
 \r
                // 日付群\r
                GregorianCalendar c = CommonUtils.getCalendar(startdt);\r
+               int hour = c.get(Calendar.HOUR_OF_DAY);\r
+               int min  = c.get(Calendar.MINUTE);\r
+               \r
                String adate = CommonUtils.getDate(c);\r
-               String atime = CommonUtils.getTime(c);\r
                String adate529 = CommonUtils.getDate529(c,true);\r
                \r
+               \r
                // 指定日付に移動して放送局の位置を確認する\r
                TVProgramIterator pli = redrawByDateWithCenter(center,adate529);\r
                if ( pli == null ) {\r
@@ -344,7 +382,11 @@ public abstract class AbsPaperView extends JPanel implements VWTimerRiseListener
                if ( ! isTabSelected(MWinTab.PAPER) ) {\r
                        setSelectedTab(MWinTab.PAPER);\r
                }\r
-                       \r
+               \r
+               /*\r
+                * マウスカーソル移動\r
+                */\r
+               \r
                // 横の列\r
                int crindex = pli.getIndex(center);\r
                if ( crindex == -1 ) {\r
@@ -363,24 +405,17 @@ public abstract class AbsPaperView extends JPanel implements VWTimerRiseListener
                }\r
                \r
                // 縦の列\r
-               int h = 0;\r
-               int m = 0;\r
                int y = 0;\r
-               Matcher ma = Pattern.compile("^(\\d\\d):(\\d\\d)$").matcher(atime);\r
-               if (ma.find()) {\r
-                       h = Integer.valueOf(ma.group(1));\r
-                       m = Integer.valueOf(ma.group(2));\r
-               }\r
                if (adate529.equals(adate)) {\r
-                       if (h < TIMEBAR_START) {\r
-                               h = TIMEBAR_START;\r
-                               m = 0;\r
+                       if (hour < TIMEBAR_START) {\r
+                               hour = TIMEBAR_START;\r
+                               min = 0;\r
                        }\r
                }\r
                else {\r
-                       h += 24;\r
+                       hour += 24;\r
                }\r
-               y = Math.round((float)((h-TIMEBAR_START)*60+m)*bounds.getPaperHeightMultiplier()*paperHeightZoom);\r
+               y = Math.round((float)((hour-TIMEBAR_START)*60+min)*bounds.getPaperHeightMultiplier()*paperHeightZoom);\r
                \r
                // 新聞面を移動する\r
                {\r
@@ -809,8 +844,8 @@ public abstract class AbsPaperView extends JPanel implements VWTimerRiseListener
                                jLayeredPane_space_main_view_byMakeshift.setLayer(b2, 0);\r
                                \r
                                // リスナーを設定する\r
-                               b2.addMouseListener(mListner);\r
-                               b2.addMouseMotionListener(mListner);\r
+                               b2.addMouseListener(ml_risepopup);\r
+                               b2.addMouseMotionListener(ml_risepopup);\r
                                frameUnused.add(b2);\r
                        }\r
                        StdAppendMessage(MSGID+"番組枠描画バッファを初期化: "+framebuffersize);\r
@@ -1348,100 +1383,112 @@ public abstract class AbsPaperView extends JPanel implements VWTimerRiseListener
                JRMLabel.setHeightMultiplier(bounds.getPaperHeightMultiplier() * paperHeightZoom);\r
                \r
                // 表示範囲\r
-               GregorianCalendar cal = CommonUtils.getCalendar(String.format("%s %02d:00",date.substring(0,10),TIMEBAR_START));\r
-               String startDateTime = CommonUtils.getDateTime(cal);\r
-               cal.add(Calendar.HOUR_OF_DAY, 24);\r
-               String endDateTime = CommonUtils.getDateTime(cal);\r
-               \r
-               // 基準日\r
-               String critDateTime = CommonUtils.getCritDateTime(env.getDisplayPassedReserve());\r
+               GregorianCalendar cal = CommonUtils.getCritCalendar(date);\r
+               String topDateTime = CommonUtils.getDateTime(cal);\r
+               cal.add(Calendar.DATE, 1);\r
+               String bottomDateTime = CommonUtils.getDateTime(cal);\r
                \r
-               // 予約枠\r
-               HashMap<String,Boolean> misCN = new HashMap<String, Boolean>();\r
+               // \r
+               String passedCritDateTime = CommonUtils.getCritDateTime(env.getDisplayPassedReserve());\r
                \r
                // ツールバーで選択されている実レコーダ\r
-               String myself = ( env.getEffectComboToPaper() ) ? (getSelectedRecorderOnToolbar()) : (null);\r
+               String myself = ( env.getEffectComboToPaper() ) ? (getSelectedMySelf()) : (null);\r
                \r
-               if ( myself == null || myself.length() > 0 ) {\r
-                       \r
-                       // ピックアップはここに入らない\r
-                       \r
-                       HDDRecorderList recs = recorders.getMyself(myself);\r
-                       \r
-                       for ( HDDRecorder recorder : recs )\r
-                       {\r
-                               //System.err.println(DBGID+recorder.Myself());\r
+               // 予約枠の描画\r
+               drawReserveBorders(date, Center, q, topDateTime, bottomDateTime, passedCritDateTime, myself);\r
+               \r
+               // ピックアップ枠の描画\r
+               drawPickupBorders(date, Center, q, topDateTime, bottomDateTime, passedCritDateTime, TUNERLABEL_PICKUP);\r
+       }\r
+       private void drawReserveBorders(String date, String Center, int q, String topDateTime, String bottomDateTime, String passedCritDateTime, String myself) {\r
+               if ( myself == HDDRecorder.SELECTED_PICKUP ) {\r
+                       return;\r
+               }\r
+               for ( HDDRecorder recorder : getSelectedRecorderList() ) {\r
+                       for ( ReserveList r : recorder.getReserves()) {\r
                                \r
-                               for ( ReserveList r : recorder.getReserves()) {\r
-                                       // Exec == ON ?\r
-                                       if (env.getDisplayOnlyExecOnEntry() && ! r.getExec()) {\r
-                                               //StdAppendMessage("@Exec = OFF : "+r.getTitle());\r
-                                               continue;\r
-                                       }\r
-                                       // 局が一致して\r
-                                       if (r.getCh_name() == null) {\r
-                                               if (r.getChannel().length() > 0) {\r
-                                                       misCN.put(r.getChannel(),true);\r
-                                               }\r
-                                               continue;\r
+                               // 「実行のみ表示」で無効な予約は表示しない\r
+                               if ( env.getDisplayOnlyExecOnEntry() && ! r.getExec() ) {\r
+                                       continue;\r
+                               }\r
+                               \r
+                               // 放送局名の確認\r
+                               if ( r.getCh_name() == null ) {\r
+                                       if ( r.getChannel() == null ) {\r
+                                               // CHコードすらないのはバグだろう\r
+                                               System.err.println(ERRID+"予約情報にCHコードが設定されていません。バグの可能性があります。 recid="+recorder.Myself()+" chname="+r.getCh_name());\r
                                        }\r
+                                       continue;\r
+                               }\r
+                               \r
+                               // 描画本体\r
+                               if (r.getCh_name().equals(Center)) {\r
                                        \r
-                                       if (r.getCh_name().equals(Center)) {\r
-                                               \r
-                                               // 開始終了日時リストを生成する\r
-                                               ArrayList<String> starts = new ArrayList<String>();\r
-                                               ArrayList<String> ends = new ArrayList<String>();\r
-                                               CommonUtils.getStartEndList(starts, ends, r);\r
-                                               \r
-                                               // 予約枠を描画する\r
-                                               for (int j=0; j<starts.size(); j++) {\r
-                                                       if (critDateTime.compareTo(ends.get(j)) <= 0) {\r
-                                                               putReserveBorderSub(date,Center,startDateTime,endDateTime,starts.get(j),ends.get(j),r.getAhh(),r.getAmm(),r.getRec_min(),r.getTuner(),recorder.getColor(r.getTuner()),r.getExec(),q);\r
-                                                       }\r
+                                       // 開始終了日時リストを生成する\r
+                                       ArrayList<String> starts = new ArrayList<String>();\r
+                                       ArrayList<String> ends = new ArrayList<String>();\r
+                                       CommonUtils.getStartEndList(starts, ends, r);\r
+                                       \r
+                                       // 予約枠を描画する\r
+                                       for ( int j=0; j<starts.size(); j++ ) {\r
+                                               if ( passedCritDateTime.compareTo(ends.get(j)) > 0 ) {\r
+                                                       // 過去情報の表示が制限されている場合\r
+                                                       continue;\r
                                                }\r
+                                               \r
+                                               drawBorder(date,Center,topDateTime,bottomDateTime,starts.get(j),ends.get(j),r.getRec_min(),r.getTuner(),recorder.getColor(r.getTuner()),r.getExec(),q);\r
                                        }\r
                                }\r
                        }\r
                }\r
-               \r
-               // ピックアップ枠\r
-               TVProgram tvp = tvprograms.getPickup();\r
-               for ( ProgList pl : tvp.getCenters() ) {\r
-                       if ( pl.Center.equals(Center) ) {\r
-                               for ( ProgDateList pcl : pl.pdate ) {\r
-                                       for ( ProgDetailList tvd : pcl.pdetail ) {\r
-                                               putReserveBorderSub(date,Center,startDateTime,endDateTime,tvd.startDateTime,tvd.endDateTime,tvd.start.substring(0,2),tvd.start.substring(3,5),String.valueOf(tvd.length),"PICKUP",CommonUtils.color2str(env.getPickedColor()),false,q);\r
+       }\r
+       private void drawPickupBorders(String date, String Center, int q, String topDateTime, String bottomDateTime, String passedCritDateTime, String tuner) {\r
+               for ( ProgList pl : tvprograms.getPickup().getCenters() ) {\r
+                       if ( ! pl.Center.equals(Center) ) {\r
+                               continue;\r
+                       }\r
+                       for ( ProgDateList pcl : pl.pdate ) {\r
+                               for ( ProgDetailList tvd : pcl.pdetail ) {\r
+                                       if ( passedCritDateTime.compareTo(tvd.endDateTime) > 0 ) {\r
+                                               // 過去情報の表示が制限されている場合\r
+                                               continue;\r
                                        }\r
+                                       \r
+                                       drawBorder(date,Center,topDateTime,bottomDateTime,tvd.startDateTime,tvd.endDateTime,tvd.length,tuner,env.getPickedColor(),false,q);\r
                                }\r
                        }\r
                }\r
        }\r
-       private void putReserveBorderSub(String date, String Center, String startDateTime, String endDateTime, String start, String end, String ahh, String amm, String recmin, String tuner, String bordercol,boolean exec,int col) {\r
-               //\r
+       private void drawBorder(String date, String Center, String topDateTime, String bottomDateTime, String startDateTime, String endDateTime, String recmin, String tuner, String bordercol, boolean exec, int col) {\r
+               drawBorder(date, Center, topDateTime, bottomDateTime, startDateTime, endDateTime, Integer.valueOf(recmin), tuner, CommonUtils.str2color(bordercol), exec, col);\r
+       }\r
+       private void drawBorder(String date, String Center, String topDateTime, String bottomDateTime, String startDateTime, String endDateTime, int recmin, String tuner, Color bordercol, boolean exec, int col) {\r
+               \r
+               GregorianCalendar ca = CommonUtils.getCalendar(startDateTime);\r
+               int ahh = ca.get(Calendar.HOUR_OF_DAY);\r
+               int amm = ca.get(Calendar.MINUTE);\r
+               \r
                int row = 0;\r
                int length = 0;\r
-               if (startDateTime.compareTo(start) <= 0 && start.compareTo(endDateTime) < 0) {\r
-                       //\r
-                       row = Integer.valueOf(ahh) - TIMEBAR_START;\r
+               if (topDateTime.compareTo(startDateTime) <= 0 && startDateTime.compareTo(bottomDateTime) < 0) {\r
+                       // 開始時刻が表示範囲内にある\r
+                       row = ahh - TIMEBAR_START;\r
                        if (row < 0) {\r
                                row += 24;\r
                        }\r
-                       row = row*60 + Integer.valueOf(amm);\r
-                       length = Integer.valueOf(recmin);\r
+                       row = row*60 + amm;\r
+                       length = recmin;\r
                }\r
-               else if (start.compareTo(startDateTime) < 0 && startDateTime.compareTo(end) < 0) {\r
-                       //\r
+               else if (startDateTime.compareTo(topDateTime) < 0 && topDateTime.compareTo(endDateTime) < 0) {\r
+                       // 表示開始位置が番組の途中にある\r
                        row = 0;\r
-                       length = Integer.valueOf(recmin) - (TIMEBAR_START*60 - Integer.valueOf(ahh)*60 - Integer.valueOf(amm));\r
+                       length = recmin - (TIMEBAR_START*60 - ahh*60 - amm);\r
                }\r
                else {\r
                        return;\r
                }\r
                \r
                {\r
-                       // 枠の色\r
-                       Color rbc = CommonUtils.str2color(bordercol);\r
-                       \r
                        // 重複予約の場合のエンコーダマーク表示位置の調整\r
                        int rc = 0;\r
                        //int rw = 0;\r
@@ -1473,9 +1520,9 @@ public abstract class AbsPaperView extends JPanel implements VWTimerRiseListener
                        }\r
                        \r
                        // エンコーダの区別がないものは"■"を表示する\r
-                       rb.setEncBackground(rbc);\r
-                       rb.setBorder(new LineBorder(rbc,4));\r
-                       if ( tuner != null && tuner.equals("PICKUP") ) {\r
+                       rb.setEncBackground(bordercol);\r
+                       rb.setBorder(new LineBorder(bordercol,4));\r
+                       if ( tuner != null && tuner.equals(TUNERLABEL_PICKUP) ) {\r
                                rb.setEncForeground(env.getPickedFontColor());\r
                        }\r
                        else if ( exec ) {\r
@@ -1576,8 +1623,8 @@ public abstract class AbsPaperView extends JPanel implements VWTimerRiseListener
                        jLayeredPane_space_main_view.setLayer(b2, 0);\r
                        \r
                        // リスナーを設定する\r
-                       b2.addMouseListener(mListner);\r
-                       b2.addMouseMotionListener(mListner);\r
+                       b2.addMouseListener(ml_risepopup);\r
+                       b2.addMouseMotionListener(ml_risepopup);\r
                }\r
                if (jLayeredPane_space_main_view == jLayeredPane_space_main_view_byMakeshift) {\r
                        frameUsed.add(b2);\r
@@ -1665,6 +1712,64 @@ public abstract class AbsPaperView extends JPanel implements VWTimerRiseListener
                return -1;\r
        }\r
        \r
+       /**\r
+        * 番組枠のクリック位置を日時に変換する\r
+        */\r
+       private String getClickedDateTime(ProgDetailList tvd, int clikedY) {\r
+               \r
+               String clickedDateTime = null;\r
+               \r
+               if ( clikedY >= 0 && tvd.start.length() != 0 ) {\r
+                       // 新聞形式ならクリック位置の日時を算出する\r
+                       GregorianCalendar cala = CommonUtils.getCalendar(tvd.startDateTime);\r
+                       cala.add(Calendar.MINUTE, Math.round(((float)clikedY)/(bounds.getPaperHeightMultiplier()*paperHeightZoom)));\r
+                       clickedDateTime = CommonUtils.getDateTime(cala);\r
+               }\r
+               \r
+               return clickedDateTime;\r
+       }\r
+       \r
+       \r
+       /*******************************************************************************\r
+        * ハンドラ―メソッド\r
+        ******************************************************************************/\r
+       \r
+       /**\r
+        * ツールバーでレコーダの選択イベントが発生\r
+        */\r
+       @Override\r
+       public void valueChanged(HDDRecorderSelectionEvent e) {\r
+               if (debug) System.out.println(DBGID+"recorder selection rised");\r
+               \r
+               // 選択中のレコーダ情報を保存する\r
+               src_recsel = (HDDRecorderSelectable) e.getSource();\r
+               \r
+               // 予約枠を書き換える\r
+               updateReserveBorder(null);\r
+       }\r
+       \r
+       private String getSelectedMySelf() {\r
+               return ( src_recsel!=null ? src_recsel.getSelectedMySelf() : null );\r
+       }\r
+       \r
+       private HDDRecorderList getSelectedRecorderList() {\r
+               return ( src_recsel!=null ? src_recsel.getSelectedList() : null );\r
+       }\r
+       \r
+       private HDDRecorderSelectable src_recsel;\r
+       \r
+       \r
+       /**\r
+        * レコーダ情報の変更イベントが発生\r
+        */\r
+       @Override\r
+       public void stateChanged(HDDRecorderChangeEvent e) {\r
+               // テーブルをリフレッシュする処理\r
+               \r
+       }\r
+       \r
+       \r
+\r
        /*******************************************************************************\r
         * リスナー\r
         ******************************************************************************/\r
@@ -1673,7 +1778,7 @@ public abstract class AbsPaperView extends JPanel implements VWTimerRiseListener
         * 現在時刻追従スクロール\r
         */\r
        @Override\r
-       public void timerRised(VWTimerRiseEvent e) {\r
+       public void timerRised(TickTimerRiseEvent e) {\r
                \r
                String curDT = CommonUtils.getDate529(0,true);\r
                \r
@@ -1736,7 +1841,7 @@ public abstract class AbsPaperView extends JPanel implements VWTimerRiseListener
        /**\r
         * 番組枠につけるマウス操作のリスナー\r
         */\r
-       private final MouseInputListener mListner = new MouseInputListener() {\r
+       private final MouseInputListener ml_risepopup = new MouseInputListener() {\r
                //\r
                private final Cursor defCursor = Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR);\r
                private final Cursor hndCursor = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);\r
@@ -1757,7 +1862,8 @@ public abstract class AbsPaperView extends JPanel implements VWTimerRiseListener
                        if (e.getButton() == MouseEvent.BUTTON3) {\r
                                if (e.getClickCount() == 1) {\r
                                        // 右シングルクリックでメニューの表示\r
-                                       showPopupForTraceProgram(b, tvd, tvd.title, TraceKey.noFazzyThreshold, p.x, p.y, e.getY());\r
+                                       String clicked = getClickedDateTime(tvd, e.getY());\r
+                                       showPopupForTraceProgram(b, tvd, tvd.title, TraceKey.noFazzyThreshold, p.x, p.y, clicked);\r
                                }\r
                        }\r
                        else if (e.getButton() == MouseEvent.BUTTON1) {\r
@@ -1767,45 +1873,13 @@ public abstract class AbsPaperView extends JPanel implements VWTimerRiseListener
                                                MWin.appendMessage(MSGID+"過去ログでダブルクリックは利用できません");\r
                                                ringBeep();\r
                                        }\r
+                                       \r
                                        return;\r
                                }\r
+                               \r
                                if (e.getClickCount() == 2) {\r
-                                       // RADIOは閲覧のみ\r
-                                       if (tvd.type == ProgType.PROG && tvd.subtype == ProgSubtype.RADIO) {\r
-                                               return;\r
-                                       }\r
-                                       // レコーダが選択されていない場合はなにもしない\r
-                                       if (recorders.size() == 0) {\r
-                                               return;\r
-                                       }\r
-                                       \r
                                        // 左ダブルクリックで予約ウィンドウを開く\r
-                                       \r
-                                       //VWReserveDialog rD = new VWReserveDialog(0, 0, env, tvprograms, recorders, avs, chavs, stwin);\r
-                                       CommonSwingUtils.setLocationCenter(parent,rD);\r
-                                       //rD.clear();\r
-                                       \r
-                                       // サブタイトルを番組追跡の対象から外す\r
-                                       boolean succeeded = false;\r
-                                       if ( ! env.getSplitEpno() && env.getTraceOnlyTitle() ) {\r
-                                               //String[] d = tvp.doSplitEpno(tvd.genre, tvd.title);\r
-                                               succeeded = rD.open(tvd,tvd.title,TraceKey.defaultFazzyThreshold);\r
-                                       }\r
-                                       else {\r
-                                               succeeded = rD.open(tvd);\r
-                                       }\r
-                                       \r
-                                       if (succeeded) {\r
-                                               rD.setVisible(true);\r
-                                       }\r
-                                       else {\r
-                                               rD.dispose();\r
-                                       }\r
-                                       \r
-                                       if (rD.isReserved()) {\r
-                                               updateReserveDisplay();\r
-                                               updateReserveBorder(tvd.center);\r
-                                       }\r
+                                       openReserveDialog(tvd);                                 \r
                                }\r
                        }\r
                        else if (e.getButton() == MouseEvent.BUTTON2) {\r
@@ -1813,6 +1887,38 @@ public abstract class AbsPaperView extends JPanel implements VWTimerRiseListener
                                addToPickup(tvd);\r
                        }\r
                }\r
+               \r
+               private void openReserveDialog(ProgDetailList tvd) {\r
+                       \r
+                       // レコーダが登録されていない場合はなにもしない\r
+                       if (recorders.size() == 0) {\r
+                               return;\r
+                       }\r
+\r
+                       // ダイアログの位置指定\r
+                       CommonSwingUtils.setLocationCenter(parent,rD);\r
+                       \r
+                       // サブタイトルを番組追跡の対象から外す\r
+                       boolean succeeded = false;\r
+                       if ( ! env.getSplitEpno() && env.getTraceOnlyTitle() ) {\r
+                               succeeded = rD.open(tvd,tvd.title,TraceKey.defaultFazzyThreshold);\r
+                       }\r
+                       else {\r
+                               succeeded = rD.open(tvd);\r
+                       }\r
+                       \r
+                       if (succeeded) {\r
+                               rD.setVisible(true);\r
+                       }\r
+                       else {\r
+                               rD.dispose();\r
+                       }\r
+                       \r
+                       if (rD.isSucceededReserve()) {\r
+                               updateReserveDisplay();\r
+                               updateReserveBorder(tvd.center);\r
+                       }\r
+               }\r
 \r
                /**\r
                 * 詳細情報の自動表示\r
@@ -2376,7 +2482,7 @@ public abstract class AbsPaperView extends JPanel implements VWTimerRiseListener
                                \r
                                rb.reVBounds();\r
                                \r
-                               if ( rb.getEncoder().equals("PICKUP") ) {\r
+                               if ( rb.getEncoder().equals(TUNERLABEL_PICKUP) ) {\r
                                        rb.setEncBackground(ec.getPickedColor());\r
                                        rb.setEncForeground(ec.getPickedFontColor());\r
                                        rb.setBorder(new LineBorder(ec.getPickedColor(),4));\r