OSDN Git Service

[予約ダイアログ]自動予約編集への対応に伴うレイアウト変更(3)
[tainavi/TinyBannavi.git] / TinyBannavi / src / tainavi / Viewer.java
index 8dd2d6c..e07ef65 100644 (file)
@@ -78,7 +78,7 @@ import tainavi.VWUpdate.UpdateResult;
 /**\r
  * メインな感じ\r
  */\r
-public class Viewer extends JFrame implements ChangeListener,VWTimerRiseListener {\r
+public class Viewer extends JFrame implements ChangeListener,TickTimerListener {\r
 \r
        private static final long serialVersionUID = 1L;\r
        \r
@@ -134,7 +134,7 @@ public class Viewer extends JFrame implements ChangeListener,VWTimerRiseListener
        private final TVProgramList progPlugins = new TVProgramList();                          // Web番組表プラグイン(テンプレート)\r
        private final TVProgramList tvprograms = new TVProgramList();                           // Web番組表プラグイン(実際に利用するもの)\r
        \r
-       private final VWTimer timer_now = new VWTimer();                                                        // 毎分00秒に起動して処理をキックするタイマー\r
+       private final TickTimer timer_now = new TickTimer();                                                    // 毎分00秒に起動して処理をキックするタイマー\r
        \r
        // 初期化的な\r
        private boolean logging = true;                                                                                 // ログ出力する\r
@@ -160,7 +160,7 @@ public class Viewer extends JFrame implements ChangeListener,VWTimerRiseListener
        private static final int OPENING_WIAT = 500;                            // まあ起動時しか使わないんですけども\r
 \r
        private static final String MSGID = "[鯛ナビ] ";\r
-       private static final String ERRID = "[ERROR]"+MSGID;\r
+//     private static final String ERRID = "[ERROR]"+MSGID;\r
        private static final String DBGID = "[DEBUG]"+MSGID;\r
        \r
        /**\r
@@ -433,11 +433,13 @@ public class Viewer extends JFrame implements ChangeListener,VWTimerRiseListener
                protected 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) {\r
                        \r
-                       timer_now.pause();\r
-                       Viewer.this.showPopupForTraceProgram(comp, tvd, keyword, threshold, x, y, h);\r
-                       timer_now.start();\r
+                       timer_now.pause();      // 停止\r
+                       \r
+                       Viewer.this.showPopupForTraceProgram(comp, tvd, keyword, threshold, x, y, null);\r
+                       \r
+                       timer_now.start();      // 再開\r
                }\r
 \r
                @Override\r
@@ -583,11 +585,13 @@ public class Viewer extends JFrame implements ChangeListener,VWTimerRiseListener
                protected 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
-                       timer_now.pause();\r
-                       Viewer.this.showPopupForTraceProgram(comp, tvd, keyword, threshold, x, y, h);\r
-                       timer_now.start();\r
+                       timer_now.pause();      // 停止\r
+                       \r
+                       Viewer.this.showPopupForTraceProgram(comp, tvd, keyword, threshold, x, y, clickedDateTime);\r
+                       \r
+                       timer_now.start();      // 再開\r
                }\r
 \r
                @Override\r
@@ -607,8 +611,6 @@ public class Viewer extends JFrame implements ChangeListener,VWTimerRiseListener
                protected void setSelectedTab(MWinTab tab) { mainWindow.setSelectedTab(tab); }\r
 \r
                @Override\r
-               protected String getSelectedRecorderOnToolbar() { return toolBar.getSelectedRecorder(); }\r
-               @Override\r
                protected boolean isFullScreen() { return toolBar.isFullScreen(); }\r
                @Override\r
                protected void setSelectedPagerIndex(int idx) {\r
@@ -695,17 +697,17 @@ public class Viewer extends JFrame implements ChangeListener,VWTimerRiseListener
                }\r
                \r
                @Override\r
-               protected JMenuItem getExecOnOffMenuItem(boolean fexec, String title,\r
-                               String chnam, String rsvId, String recId) {\r
+               protected JMenuItem getExecOnOffMenuItem(boolean fexec,\r
+                               String start, String title, String chnam, String rsvId, String recId) {\r
 \r
-                       return Viewer.this.getExecOnOffMenuItem(fexec, title, chnam, rsvId, recId, 0);\r
+                       return Viewer.this.getExecOnOffMenuItem(fexec, start, title, chnam, rsvId, recId, 0);\r
                }\r
 \r
                @Override\r
-               protected JMenuItem getRemoveRsvMenuItem(String title, String chnam,\r
-                               String rsvId, String recId) {\r
+               protected JMenuItem getRemoveRsvMenuItem(\r
+                               String start, String title, String chnam,       String rsvId, String recId) {\r
                        \r
-                       return Viewer.this.getRemoveRsvMenuItem(title, chnam, rsvId, recId, 0);\r
+                       return Viewer.this.getRemoveRsvMenuItem(start, title, chnam, rsvId, recId, 0);\r
                }\r
 \r
                @Override\r
@@ -1199,12 +1201,9 @@ public class Viewer extends JFrame implements ChangeListener,VWTimerRiseListener
                 */\r
                \r
                @Override\r
-               protected void searchLikeRsv(LikeReserveList likeRsvList, ProgDetailList tvd, String keyword, int threshold) {\r
-                       Viewer.this.searchLikeRsv(likeRsvList, tvd, keyword, threshold);\r
+               protected LikeReserveList findLikeReserves(ProgDetailList tvd, String keyword, int threshold) {\r
+                       return Viewer.this.findLikeReserves(tvd, keyword, threshold);\r
                }\r
-\r
-               @Override\r
-               protected String getSelectedRecorderOnToolbar() { return toolBar.getSelectedRecorder(); }\r
        }\r
        \r
        /**\r
@@ -1431,10 +1430,12 @@ public class Viewer extends JFrame implements ChangeListener,VWTimerRiseListener
                                recorded.redrawRecordedList();\r
                        }\r
                        \r
+                       /*\r
                        // 新聞形式の予約枠を書き換えるかもよ?\r
                        if (env.getEffectComboToPaper()) {\r
                                paper.updateReserveBorder(null);\r
                        }\r
+                       */\r
                        \r
                        timer_now.start();\r
                        \r
@@ -1576,102 +1577,29 @@ public class Viewer extends JFrame implements ChangeListener,VWTimerRiseListener
        /**\r
         * 類似予約をさがす\r
         */\r
-       private void searchLikeRsv(LikeReserveList likeRsvList, ProgDetailList tvd, String keyword, int threshold) {\r
-               \r
-               likeRsvList.clear();\r
+       private LikeReserveList findLikeReserves(ProgDetailList tvd, String keyword, int threshold) {\r
                \r
-               // 曖昧検索のための初期化\r
-               String keywordPop = null;\r
+               String keywordVal = null;\r
                int thresholdVal = 0;\r
-               if (threshold > 0) {\r
-                       // キーワード指定がある場合\r
-                       keywordPop = TraceProgram.replacePop(keyword);\r
-                       thresholdVal = threshold;\r
-               }\r
-               else {\r
-                       // キーワード指定がない場合\r
-                       keywordPop = tvd.titlePop;\r
-                       thresholdVal = env.getDefaultFazzyThreshold();\r
-               }\r
-\r
-               // 検索範囲\r
-               long rangeLikeRsv = env.getRangeLikeRsv()*3600000;\r
                \r
-               HashMap<String,Boolean> misCN = new HashMap<String, Boolean>();\r
-               for ( HDDRecorder recorder : recorders ) {\r
-                       \r
-                       // 終了した予約を整理する\r
-                       recorder.refreshReserves();\r
-                       \r
-                       for ( ReserveList r : recorder.getReserves() ) {\r
-                               \r
-                               // タイトルのマッチング\r
-                               boolean isExist = false;\r
-                               if (env.getDisableFazzySearch() == false) {\r
-                                       // 双方向の比較を行う・正引き\r
-                                       int fazScore = TraceProgram.sumScore(keywordPop, r.getTitlePop());\r
-                                       if ( fazScore >= thresholdVal) {\r
-                                               isExist = true;\r
-                                       }\r
-                                       else if ( ! env.getDisableFazzySearchReverse()) {\r
-                                               // 逆引き\r
-                                               fazScore = TraceProgram.sumScore(r.getTitlePop(), keywordPop);\r
-                                               if ( fazScore >= thresholdVal) {\r
-                                                       isExist = true;\r
-                                               }\r
-                                       }\r
-                               }\r
-                               else {\r
-                                       if (r.getTitlePop().equals(tvd.titlePop)) {\r
-                                               isExist = true;\r
-                                       }\r
-                               }\r
-                               if ( ! isExist) {\r
-                                       continue;\r
-                               }\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 ( ! r.getCh_name().equals(tvd.center)) {\r
-                                       continue;\r
-                               }\r
-                               \r
-                               // 近接時間チェック\r
-                               boolean inRange = true;\r
-                               if (rangeLikeRsv > 0) {\r
-                                       \r
-                                       inRange = false;\r
-                                       \r
-                                       ArrayList<String> starts = new ArrayList<String>();\r
-                                       ArrayList<String> ends = new ArrayList<String>();\r
-                                       CommonUtils.getStartEndList(starts, ends, r);\r
-                                       for (int j=0; j<starts.size(); j++) {\r
-                                               long d = CommonUtils.getDiffDateTime(tvd.startDateTime, starts.get(j));\r
-                                               //StdAppendMessage(String.format("%s %s %d", tvd.startDateTime, starts.get(j),d));\r
-                                               if (d <= rangeLikeRsv) {\r
-                                                       inRange = true;\r
-                                                       break;\r
-                                               }\r
-                                       }\r
-                               }\r
-                               if ( ! inRange) {\r
-                                       continue;\r
-                               }\r
-                               \r
-                               // 類似予約あり!\r
-                               likeRsvList.add(new LikeReserveItem(recorder, r));\r
+               // 曖昧検索のための初期化\r
+               if ( ! env.getDisableFazzySearch() ) {\r
+                       if ( threshold > 0 ) {\r
+                               // キーワード指定がある場合\r
+                               keywordVal = TraceProgram.replacePop(keyword);\r
+                               thresholdVal = threshold;\r
+                       }\r
+                       else {\r
+                               // キーワード指定がない場合\r
+                               keywordVal = tvd.titlePop;\r
+                               thresholdVal = env.getDefaultFazzyThreshold();\r
                        }\r
                }\r
-               \r
-               return;\r
+\r
+               // 検索実行\r
+               return recorders.findLikeReserves(tvd, keywordVal, thresholdVal, env.getRangeLikeRsv(), ! env.getDisableFazzySearchReverse());\r
        }\r
        \r
-       \r
        /***\r
         * \r
         * リスト・新聞形式共通\r
@@ -1684,7 +1612,7 @@ public class Viewer extends JFrame implements ChangeListener,VWTimerRiseListener
        public 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
                JPopupMenu pop = new JPopupMenu();\r
        \r
@@ -1695,7 +1623,10 @@ public class Viewer extends JFrame implements ChangeListener,VWTimerRiseListener
                        // 過去ログは処理対象外です\r
                }\r
                else {\r
-                       JMenuItem menuItem = new JMenuItem("予約する【"+tvd.title+" ("+tvd.center+")】");\r
+                       JMenuItem menuItem = new JMenuItem(String.format("予約する【%s %s - %s(%s)】",tvd.accurateDate,tvd.start,tvd.title,tvd.center));\r
+                       menuItem.setForeground(new Color(0,127,0));\r
+                       Font f = menuItem.getFont();\r
+                       menuItem.setFont(f.deriveFont(f.getStyle()|Font.BOLD));\r
                        \r
                        menuItem.addActionListener(new ActionListener() {\r
                                public void actionPerformed(ActionEvent e) {\r
@@ -1710,7 +1641,7 @@ public class Viewer extends JFrame implements ChangeListener,VWTimerRiseListener
                                        }\r
                                        \r
                                        //\r
-                                       if (rdialog.isReserved()) {\r
+                                       if (rdialog.isSucceededReserve()) {\r
                                                listed.updateReserveMark();\r
                                                paper.updateReserveBorder(tvd.center);\r
                                                reserved.redrawReservedList();\r
@@ -1723,24 +1654,20 @@ public class Viewer extends JFrame implements ChangeListener,VWTimerRiseListener
                pop.addSeparator();\r
                \r
                // 類似予約検索\r
-               LikeReserveList likeRsvList = new LikeReserveList();\r
-               searchLikeRsv(likeRsvList, tvd, "", 0);\r
+               LikeReserveList likeRsvList;\r
+               if ( env.getDisableFazzySearch() ) {\r
+                       likeRsvList = recorders.findLikeReserves(tvd, null, 0, env.getRangeLikeRsv(), false);\r
+               }\r
+               else {\r
+                       likeRsvList = recorders.findLikeReserves(tvd, tvd.titlePop, env.getDefaultFazzyThreshold(), env.getRangeLikeRsv(), ! env.getDisableFazzySearchReverse());\r
+               }\r
                \r
                // 重複予約検索\r
-               LikeReserveList overlapRsvList = new LikeReserveList();\r
-               searchOverlapRsv(overlapRsvList, tvd, h);\r
-               \r
+               LikeReserveList overlapRsvList = recorders.findOverlapReserves(tvd, clickedDateTime);\r
+\r
                // 類似と重複で被るものを重複から除外\r
-               for ( LikeReserveItem ll : likeRsvList ) {\r
-                       int i=0;\r
-                       for ( ; i<overlapRsvList.size(); i++ ) {\r
-                               if ( ll.getRsv() == overlapRsvList.getRsv(i) ) {\r
-                                       break;\r
-                               }\r
-                       }\r
-                       if ( i < overlapRsvList.size() ) {\r
-                               overlapRsvList.remove(i);\r
-                       }\r
+               for ( LikeReserveItem item : likeRsvList ) {\r
+                       overlapRsvList.removeDup(item);\r
                }\r
                \r
                // 予約実行ON・OFF\r
@@ -1756,15 +1683,16 @@ public class Viewer extends JFrame implements ChangeListener,VWTimerRiseListener
                                        rsvList = overlapRsvList;\r
                                }\r
                                \r
-                               for ( int i=0; i<rsvList.size(); i++ ) {\r
+                               for ( LikeReserveItem rsvItem : rsvList ) {\r
                                        \r
-                                       final boolean fexec = rsvList.getRsv(i).getExec();\r
-                                       final String title = rsvList.getRsv(i).getTitle();\r
-                                       final String chnam = rsvList.getRsv(i).getCh_name();\r
-                                       final String rsvId = rsvList.getRsv(i).getId();\r
-                                       final String recId = rsvList.getRec(i).Myself();\r
+                                       final boolean fexec = rsvItem.getRsv().getExec();\r
+                                       final String start = rsvItem.getRsv().getAhh()+":"+rsvItem.getRsv().getAmm();\r
+                                       final String title = rsvItem.getRsv().getTitle();\r
+                                       final String chnam = rsvItem.getRsv().getCh_name();\r
+                                       final String rsvId = rsvItem.getRsv().getId();\r
+                                       final String recId = rsvItem.getRec().Myself();\r
                                        \r
-                                       pop.add(getExecOnOffMenuItem(fexec,title,chnam,rsvId,recId,n));\r
+                                       pop.add(getExecOnOffMenuItem(fexec,start,title,chnam,rsvId,recId,n));\r
                                }\r
                                \r
                                pop.addSeparator();\r
@@ -1786,14 +1714,15 @@ public class Viewer extends JFrame implements ChangeListener,VWTimerRiseListener
                                        rsvList = overlapRsvList;\r
                                }\r
                                \r
-                               for (int i=0; i<rsvList.size(); i++) {\r
+                               for ( LikeReserveItem rsvItem : rsvList ) {\r
                                        \r
-                                       final String title = rsvList.getRsv(i).getTitle();\r
-                                       final String chnam = rsvList.getRsv(i).getCh_name();\r
-                                       final String rsvId = rsvList.getRsv(i).getId();\r
-                                       final String recId = rsvList.getRec(i).Myself();\r
+                                       final String start = rsvItem.getRsv().getAhh()+":"+rsvItem.getRsv().getAmm();\r
+                                       final String title = rsvItem.getRsv().getTitle();\r
+                                       final String chnam = rsvItem.getRsv().getCh_name();\r
+                                       final String rsvId = rsvItem.getRsv().getId();\r
+                                       final String recId = rsvItem.getRec().Myself();\r
                                        \r
-                                       pop.add(getRemoveRsvMenuItem(title,chnam,rsvId,recId,n));\r
+                                       pop.add(getRemoveRsvMenuItem(start, title,chnam,rsvId,recId,n));\r
                                }\r
                                \r
                                pop.addSeparator();\r
@@ -1807,7 +1736,7 @@ public class Viewer extends JFrame implements ChangeListener,VWTimerRiseListener
                // ジャンプする\r
                {\r
                        if ( mainWindow.isTabSelected(MWinTab.LISTED) ) {\r
-                               pop.add(getJumpMenuItem(tvd.title,tvd.center,tvd.startDateTime));\r
+                               pop.add(getJumpMenuItem(tvd.title,tvd.center,tvd.accurateDate+" "+tvd.start));\r
                        }\r
                        if ( mainWindow.isTabSelected(MWinTab.LISTED) || mainWindow.isTabSelected(MWinTab.PAPER) ) {\r
                                JMenuItem mi = getJumpToLastWeekMenuItem(tvd.title,tvd.center,tvd.startDateTime);\r
@@ -1940,8 +1869,8 @@ public class Viewer extends JFrame implements ChangeListener,VWTimerRiseListener
                        \r
                        if ( ! isRemoveItem )   // 過去ログは処理対象外です\r
                        {\r
-                               final String label = tvd.title+" ("+tvd.center+")";\r
-                               JMenuItem menuItem = new JMenuItem("ピックアップへの追加【"+label+"】");\r
+                               final String label = String.format("%s(%s)",tvd.title,tvd.center);\r
+                               JMenuItem menuItem = new JMenuItem(String.format("ピックアップへの追加【%s %s - %s】",tvd.accurateDate,tvd.start,label));\r
                                menuItem.addActionListener(new ActionListener() {\r
                                        public void actionPerformed(ActionEvent e) {\r
                                                //\r
@@ -2357,10 +2286,17 @@ public class Viewer extends JFrame implements ChangeListener,VWTimerRiseListener
        /**\r
         *  予約を削除するメニューアイテム\r
         */\r
-       private JMenuItem getRemoveRsvMenuItem(final String title, final String chnam, final String rsvId, final String recId, int n) {\r
+       private JMenuItem getRemoveRsvMenuItem(final String start, final String title, final String chnam, final String rsvId, final String recId, int n) {\r
                //\r
-               JMenuItem menuItem = new JMenuItem(((n==0)?"予約を削除する【":"隣接予約を削除する【")+title+"("+chnam+")/"+recId+"】");\r
+               JMenuItem menuItem = new JMenuItem();\r
+               \r
+               String mode = "削除";\r
                menuItem.setForeground(Color.RED);\r
+               \r
+               String target = ( n==0 ) ? "予約" : "隣接予約";\r
+\r
+               menuItem.setText(String.format("%sを%sにする【%s - %s(%s)/%s】",target,mode,start,title,chnam,recId));\r
+               \r
                if ( recId.equals(toolBar.getSelectedRecorder()) ) {\r
                        // 選択中のレコーダのものは太字に\r
                        Font f = menuItem.getFont();\r
@@ -2477,7 +2413,7 @@ public class Viewer extends JFrame implements ChangeListener,VWTimerRiseListener
                        rdialog.setOnlyUpdateExec(fexec);\r
                        rdialog.doUpdate();\r
                        \r
-                       if (rdialog.isReserved()) {\r
+                       if (rdialog.isSucceededReserve()) {\r
                                // 予約状況を更新\r
                                listed.updateReserveMark();\r
                                paper.updateReserveBorder(chnam);\r
@@ -2499,7 +2435,7 @@ public class Viewer extends JFrame implements ChangeListener,VWTimerRiseListener
        /**\r
         *  予約実行をONOFFするメニューアイテム\r
         */\r
-       private JMenuItem getExecOnOffMenuItem(final boolean fexec, final String title, final String chnam, final String rsvId, final String recId, int n) {\r
+       private JMenuItem getExecOnOffMenuItem(final boolean fexec, final String start, final String title, final String chnam, final String rsvId, final String recId, int n) {\r
                \r
                JMenuItem menuItem = new JMenuItem();\r
                \r
@@ -2510,9 +2446,12 @@ public class Viewer extends JFrame implements ChangeListener,VWTimerRiseListener
                }\r
                else {\r
                        mode = "OFF";\r
+                       menuItem.setForeground(Color.BLACK);\r
                }\r
-               \r
-               menuItem.setText(((n==0)?"予約を":"隣接予約を")+mode+"にする【"+title+"("+chnam+")/"+recId+")】");\r
+\r
+               String target = ( n==0 ) ? "予約" : "隣接予約";\r
+\r
+               menuItem.setText(String.format("%sを%sにする【%s - %s(%s)/%s】",target,mode,start,title,chnam,recId));\r
                \r
                if ( recId.equals(toolBar.getSelectedRecorder()) ) {\r
                        // 選択中のレコーダのものは太字に\r
@@ -2532,7 +2471,7 @@ public class Viewer extends JFrame implements ChangeListener,VWTimerRiseListener
                                        rdialog.setOnlyUpdateExec( ! fexec);\r
                                        rdialog.doUpdate();\r
                                        \r
-                                       if (rdialog.isReserved()) {\r
+                                       if (rdialog.isSucceededReserve()) {\r
                                                // 予約状況を更新\r
                                                listed.updateReserveMark();\r
                                                paper.updateReserveBorder(chnam);\r
@@ -2558,7 +2497,7 @@ public class Viewer extends JFrame implements ChangeListener,VWTimerRiseListener
         *  新聞形式へジャンプするメニューアイテム\r
         */\r
        private JMenuItem getJumpMenuItem(final String title, final String chnam, final String startDT) {\r
-               JMenuItem menuItem = new JMenuItem("番組欄へジャンプする【"+title+" ("+chnam+")】");\r
+               JMenuItem menuItem = new JMenuItem(String.format("番組欄へジャンプする【%s - %s(%s)】",startDT,title,chnam));\r
                menuItem.addActionListener(new ActionListener() {\r
                        public void actionPerformed(ActionEvent e) {\r
                                paper.jumpToBangumi(chnam,startDT);\r
@@ -2566,15 +2505,18 @@ public class Viewer extends JFrame implements ChangeListener,VWTimerRiseListener
                });\r
                return menuItem;\r
        }\r
-       private JMenuItem getJumpToLastWeekMenuItem(final String title, final String chnam, final String startDT) {\r
+       private JMenuItem getJumpToLastWeekMenuItem( final String title, final String chnam, final String startDT) {\r
                GregorianCalendar cal = CommonUtils.getCalendar(startDT);\r
+               \r
                if ( cal != null ) {\r
-                       JMenuItem menuItem = new JMenuItem("先週の番組欄へジャンプする【"+title+" ("+chnam+")】");\r
                        cal.add(Calendar.DATE, -7);\r
-                       final String lastweek = CommonUtils.getDateTime(cal);\r
+                       final String lastdatetime = CommonUtils.getDateTimeW(cal);\r
+                       \r
+                       JMenuItem menuItem = new JMenuItem(String.format("先週の番組欄へジャンプする【%s - (%s)】",lastdatetime,chnam));\r
+                       \r
                        menuItem.addActionListener(new ActionListener() {\r
                                public void actionPerformed(ActionEvent e) {\r
-                                       paper.jumpToBangumi(chnam,lastweek);\r
+                                       paper.jumpToBangumi(chnam,lastdatetime);\r
                                }\r
                        });\r
                        return menuItem;\r
@@ -2582,79 +2524,6 @@ public class Viewer extends JFrame implements ChangeListener,VWTimerRiseListener
                return null;\r
        }\r
        \r
-       // カーソル位置にかかる予約枠の検索\r
-       private void searchOverlapRsv(LikeReserveList overlapRsvList, ProgDetailList tvd, int h)\r
-       {\r
-               String clicked = "";\r
-               if ( h >= 0 && tvd.start.length() != 0 ) {\r
-                       // 新聞形式ならクリック位置の日時を算出する\r
-                       GregorianCalendar cala = CommonUtils.getCalendar(tvd.startDateTime);\r
-                       if ( CommonUtils.isLateNight(cala.get(Calendar.HOUR_OF_DAY)) ) {\r
-                               cala.set(Calendar.HOUR_OF_DAY, TIMEBAR_START);\r
-                               cala.set(Calendar.MINUTE, 0);\r
-                       }\r
-                       cala.add(Calendar.MINUTE, Math.round(h/bounds.getPaperHeightMultiplier()));\r
-                       clicked = CommonUtils.getDateTime(cala);\r
-                       //StdAppendError("clicked:"+clicked);\r
-               }\r
-               \r
-               HashMap<String,Boolean> misCN = new HashMap<String, Boolean>();\r
-               for ( HDDRecorder recorder : recorders ) {\r
-                       \r
-                       // 終了した予約を整理する\r
-                       recorder.refreshReserves();\r
-                       \r
-                       for ( ReserveList r : recorder.getReserves() ) {\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 ( ! r.getCh_name().equals(tvd.center)) {\r
-                                       continue;\r
-                               }\r
-                               \r
-                               // 重複時間チェック\r
-                               boolean inRange = false;\r
-                               {\r
-                                       ArrayList<String> starts = new ArrayList<String>();\r
-                                       ArrayList<String> ends = new ArrayList<String>();\r
-                                       CommonUtils.getStartEndList(starts, ends, r);\r
-                                       if ( h >= 0 ) {\r
-                                               // 新聞形式はピンポイント(マウスポインタのある位置の時刻)\r
-                                               for (int j=0; j<starts.size(); j++) {\r
-                                                       if ( clicked.compareTo(starts.get(j)) >= 0 && clicked.compareTo(ends.get(j)) <= 0 ) {\r
-                                                               inRange = true;\r
-                                                               break;\r
-                                                       }\r
-                                               }\r
-                                       }\r
-                                       else {\r
-                                               // リスト形式は幅がある(開始~終了までの間のいずれかの時刻)\r
-                                               for (int j=0; j<starts.size(); j++) {\r
-                                                       if ( CommonUtils.isOverlap(tvd.startDateTime, tvd.endDateTime, starts.get(j), ends.get(j), false) ) {\r
-                                                               inRange = true;\r
-                                                               break;\r
-                                                       }\r
-                                               }\r
-                                       }\r
-                               }\r
-                               if ( ! inRange) {\r
-                                       continue;\r
-                               }\r
-                               \r
-                               // 類似予約あり!\r
-                               overlapRsvList.add(new LikeReserveItem(recorder, r));\r
-                       }\r
-               }\r
-               \r
-               return;\r
-       }\r
-       \r
-       \r
        /*******************************************************************************\r
         * タイマー関連\r
         ******************************************************************************/\r
@@ -3098,7 +2967,7 @@ public class Viewer extends JFrame implements ChangeListener,VWTimerRiseListener
        private void loadTVProgramOnce(TVProgram tvp, String sType, String aName, boolean loadonly, boolean force) {\r
                \r
                final String FUNCID = "[Web番組表取得] ";\r
-               final String ERRID = "[ERROR]"+FUNCID;\r
+//             final String ERRID = "[ERROR]"+FUNCID;\r
                \r
                // ログ\r
                String msg = FUNCID+sType+"を取得します: "+tvp.getTVProgramId();\r
@@ -4240,43 +4109,64 @@ public class Viewer extends JFrame implements ChangeListener,VWTimerRiseListener
         * @return true:前回終了時の設定がある場合\r
         */\r
        private boolean buildMainWindow() {\r
-               //\r
-               mainWindow.addToolBar(toolBar);\r
-               mainWindow.addStatusArea(mwin);\r
-               \r
-               mainWindow.addTab(listed, MWinTab.LISTED);\r
-               mainWindow.addTab(paper, MWinTab.PAPER);\r
-               mainWindow.addTab(reserved, MWinTab.RSVED);\r
-               mainWindow.addTab(recorded, MWinTab.RECED);\r
-               mainWindow.addTab(autores, MWinTab.AUTORES);\r
-               mainWindow.addTab(setting, MWinTab.SETTING);\r
-               mainWindow.addTab(recsetting, MWinTab.RECSET);\r
-               mainWindow.addTab(chsetting, MWinTab.CHSET);\r
-               mainWindow.addTab(chsortsetting, MWinTab.CHSORT);\r
-               mainWindow.addTab(chconvsetting, MWinTab.CHCONV);\r
-               mainWindow.addTab(chdatsetting, MWinTab.CHDAT);\r
                \r
-               //新聞描画枠のリセット\r
-               paper.clearPanel();\r
-               paper.buildMainViewByDate();\r
+               // コンポーネント作成\r
+               {\r
+                       // メインウィンドウの作成\r
+                       mainWindow = new VWMainWindow();\r
                \r
-               // サイドツリーのデフォルトノードの選択\r
-               paper.selectTreeDefault();\r
-               listed.selectTreeDefault();\r
+                       // 内部クラスのインスタンス生成\r
+                       toolBar = new VWToolBar();\r
+                       listed = new VWListedView();\r
+                       paper = new VWPaperView();\r
+                       reserved = new VWReserveListView();\r
+                       recorded = new VWRecordedListView();\r
+                       autores = new VWAutoReserveListView();\r
+                       setting = new VWSettingView();\r
+                       recsetting = new VWRecorderSettingView();\r
+                       chsetting = new VWChannelSettingView();\r
+                       chdatsetting = new VWChannelDatSettingView();\r
+                       chsortsetting = new VWChannelSortView();\r
+                       chconvsetting = new VWChannelConvertView();\r
+               }\r
                \r
-               if ( recInfoList.size() > 0 ) {\r
-                       // 前回終了時設定が存在する場合\r
-                       \r
-                       // 開いていたタブ\r
-                       mainWindow.setShowSettingTabs(bounds.getShowSettingTabs());\r
-                       \r
-                       // ステータスエリアの高さ\r
-                       mwin.setRows(bounds.getStatusRows());\r
-                       \r
-                       return false;\r
+               // 初期値\r
+               {\r
+                       // 設定\r
+                       toolBar.setDebug(env.getDebug());\r
+                       autores.setDebug(env.getDebug());\r
+       \r
+                       // ページャーの設定\r
+                       toolBar.setPagerItems();\r
                }\r
                \r
-               // 前回終了時設定が存在しない場合\r
+               // コンポーネントの組み立て\r
+               {\r
+                       // ツールバーなど\r
+                       mainWindow.addToolBar(toolBar);\r
+                       mainWindow.addStatusArea(mwin);\r
+                       \r
+                       // タブ群\r
+                       mainWindow.addTab(listed, MWinTab.LISTED);\r
+                       mainWindow.addTab(paper, MWinTab.PAPER);\r
+                       mainWindow.addTab(reserved, MWinTab.RSVED);\r
+                       mainWindow.addTab(recorded, MWinTab.RECED);\r
+                       mainWindow.addTab(autores, MWinTab.AUTORES);\r
+                       mainWindow.addTab(setting, MWinTab.SETTING);\r
+                       mainWindow.addTab(recsetting, MWinTab.RECSET);\r
+                       mainWindow.addTab(chsetting, MWinTab.CHSET);\r
+                       mainWindow.addTab(chsortsetting, MWinTab.CHSORT);\r
+                       mainWindow.addTab(chconvsetting, MWinTab.CHCONV);\r
+                       mainWindow.addTab(chdatsetting, MWinTab.CHDAT);\r
+               }\r
+               \r
+               // ステータスエリアを開く\r
+               setStatusVisible(bounds.getShowStatus());\r
+               \r
+               //新聞描画枠のリセット\r
+               paper.clearPanel();\r
+               paper.buildMainViewByDate();\r
+               \r
                return true;\r
        }\r
        \r
@@ -4416,7 +4306,7 @@ public class Viewer extends JFrame implements ChangeListener,VWTimerRiseListener
        }\r
        \r
        @Override\r
-       public void timerRised(VWTimerRiseEvent e) {\r
+       public void timerRised(TickTimerRiseEvent e) {\r
                if (env.getDebug()) System.out.println("Timer Rised: now="+CommonUtils.getDateTimeYMDx(e.getCalendar()));\r
                setTitleBar();\r
        }\r
@@ -4684,47 +4574,15 @@ public class Viewer extends JFrame implements ChangeListener,VWTimerRiseListener
                        System.exit(1);\r
                }\r
                \r
-               // LookAndFeelとフォントを変更する\r
-               //initLookAndFeelAndFont();\r
-               //updateComponentTreeUI();\r
-               \r
                // 背景色設定ダイアログにフォント名の一覧を設定する\r
                pcwin.setFontList(vwfont);\r
                \r
                // (新聞形式の)ツールチップの表示時間を変更する\r
                setTooltipDelay();\r
 \r
-               boolean firstRun = true;\r
+               // ウィンドウを構築\r
                try {\r
-                       // メインウィンドウの作成\r
-                       mainWindow = new VWMainWindow();\r
-               \r
-                       // 内部クラスのインスタンス生成\r
-                       toolBar = new VWToolBar();\r
-                       listed = new VWListedView();\r
-                       paper = new VWPaperView();\r
-                       reserved = new VWReserveListView();\r
-                       recorded = new VWRecordedListView();\r
-                       autores = new VWAutoReserveListView();\r
-                       setting = new VWSettingView();\r
-                       recsetting = new VWRecorderSettingView();\r
-                       chsetting = new VWChannelSettingView();\r
-                       chdatsetting = new VWChannelDatSettingView();\r
-                       chsortsetting = new VWChannelSortView();\r
-                       chconvsetting = new VWChannelConvertView();\r
-                       \r
-                       // 設定のほにゃらら\r
-                       toolBar.setDebug(env.getDebug());\r
-                       autores.setDebug(env.getDebug());\r
-\r
-                       // ページャーの設定\r
-                       toolBar.setPagerItems();\r
-                       \r
-                       // ウィンドウを構築\r
-                       firstRun = buildMainWindow();\r
-                       \r
-                       // ステータスエリアを開く\r
-                       setStatusVisible(bounds.getShowStatus());\r
+                       buildMainWindow();\r
                }\r
                catch ( Exception e ) {\r
                        System.err.println("【致命的エラー】ウィンドウの構築に失敗しました");\r
@@ -4732,7 +4590,9 @@ public class Viewer extends JFrame implements ChangeListener,VWTimerRiseListener
                        System.exit(1);\r
                }\r
                \r
-               // ステータスエリアの開閉(不要)\r
+               // ★★★★★★★★★★\r
+               //int x = 2/0;  // サブスレッドの突然死のトラップを確認するためのコード\r
+               // ★★★★★★★★★★\r
                \r
                // トレイアイコンを作る\r
                getTrayIcon();\r
@@ -4756,41 +4616,62 @@ public class Viewer extends JFrame implements ChangeListener,VWTimerRiseListener
                        }\r
                });\r
                \r
-               // タブを選択\r
-               ShowInitTab();\r
-               \r
                // 初回起動時はレコーダの登録を促す\r
-               if (firstRun) {\r
+               if ( recorders.size() == 0 ) {\r
                        Container cp = getContentPane();\r
                        JOptionPane.showMessageDialog(cp, "レコーダが登録されていません。\n最初に登録を行ってください。\n番組表だけを使いたい場合は、\nNULLプラグインを登録してください。");\r
                }\r
                \r
+               // ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\r
+               // イベントリスナーの登録 \r
+               // ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\r
+               \r
+               // [ツールバー/共通] レコーダ情報変更\r
+               toolBar.addHDDRecorderChangeListener(autores);\r
+               \r
+               // [ツールバー/レコーダ選択]\r
+               toolBar.addHDDRecorderSelectionListener(paper);         // 新聞形式\r
+               toolBar.addHDDRecorderSelectionListener(autores);       // 自動予約一覧\r
+               toolBar.addHDDRecorderSelectionListener(rdialog);       // 予約ダイアログ\r
+               \r
+               // [タイマー] タイトルバー更新/リスト形式の現在時刻ノード/新聞形式の現在時刻ノード\r
+               timer_now.addTickTimerRiseListener(this);\r
+               timer_now.addTickTimerRiseListener(listed);\r
+               timer_now.addTickTimerRiseListener(paper);\r
+\r
+               // ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\r
+               // [Fire!] レコーダ選択\r
+               // ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\r
+               toolBar.setSelectedRecorder(bounds.getSelectedRecorderId());\r
+               \r
+               // ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\r
+               // [Fire!] サイドツリーのデフォルトを選択することで番組情報の描画を開始する\r
+               // ※ここ以前だとぬぽとかOOBとか出るかもよ!\r
+               // ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\r
+               paper.selectTreeDefault();\r
+               listed.selectTreeDefault();\r
+               \r
+               // ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\r
                // メインウィンドウをスプラッシュからコンポーネントに入れ替える\r
+               // ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\r
                this.setVisible(false);\r
                this.setContentPane(mainWindow);\r
                setInitBounds();\r
                this.setVisible(true);\r
                \r
-               // タイトル更新\r
-               setTitleBar();\r
+               setTitleBar();  // タイトルバー更新\r
                \r
-               // [ツールバー/レコーダ選択] 自動予約一覧\r
-               toolBar.addVWHDDRecorderSelectionListener(autores);\r
+               ShowInitTab();  // 前回開いていたタブを開く\r
                \r
-               // レコーダ選択イベントキック\r
-               toolBar.setSelectedRecorder(bounds.getSelectedRecorderId());\r
-               \r
-               // [タイマー] タイトルバー更新/リスト形式の現在時刻ノード/新聞形式の現在時刻ノード\r
-               timer_now.addVWTimerRiseListener(this);\r
-               timer_now.addVWTimerRiseListener(listed);\r
-               timer_now.addVWTimerRiseListener(paper);\r
-               \r
-               // タイマー起動\r
+               // ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\r
+               // タイマーを起動する\r
+               // ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\r
                timer_now.start();\r
                \r
-               // メッセージだ\r
+               // ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\r
+               // 初期化終了\r
+               // ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\r
                mwin.appendMessage(String.format("タイニー番組ナビゲータが起動しました (VersionInfo:%s on %s)",VersionInfo.getVersion(),VersionInfo.getEnvironment()));\r
-               \r
                initialized = true;\r
        }\r
 }\r