OSDN Git Service

予約一覧取得サブメニューの改善ほか
authorpeeweedee <peeweedee@users.sourceforge.jp>
Sat, 20 Jul 2013 14:30:01 +0000 (23:30 +0900)
committerpeeweedee <peeweedee@users.sourceforge.jp>
Sat, 20 Jul 2013 14:30:01 +0000 (23:30 +0900)
14 files changed:
TinyBannavi/05_history.txt
TinyBannavi/env/ChannelConvert.dat
TinyBannavi/src/tainavi/AbsReserveDialog.java
TinyBannavi/src/tainavi/AbsSettingView.java
TinyBannavi/src/tainavi/AbsToolBar.java
TinyBannavi/src/tainavi/HDDRecorder.java
TinyBannavi/src/tainavi/HDDRecorderUtils.java
TinyBannavi/src/tainavi/PlugIn_CSPSkyperfectTV2012.java
TinyBannavi/src/tainavi/PlugIn_RecGoogleCalendar.java
TinyBannavi/src/tainavi/PlugIn_RecRD_EDCB.java
TinyBannavi/src/tainavi/PlugIn_RecRD_TvRock.java
TinyBannavi/src/tainavi/RecSettingEditorPanel.java
TinyBannavi/src/tainavi/Viewer.java
TinyBannavi/src/todo.txt

index 68eb7f1..f59b27c 100644 (file)
  ・(リスト形式/新聞形式) 右クリックメニュー最上段に「隣接予約の編集」を追加 ※改変期に同時間帯で番組名が変わった場合などに利用 \r
  ・(その他) 右クリックメニューの予約実行、予約ON・OFF、予約削除、先週へジャンプなどに開始日時の表示を追加 \r
  ・(レコーダ対応) 予約一覧取得時の、番組詳細/自動予約一覧/録画結果一覧の同時取得有効無効の取扱いを変更 ※既存の設定は破棄、初回実行時に確認ダイアログが出るので設定しなおす \r
- ・(Web番組表対応) タイトル/番組詳細に「コメンタリ」の文字があったら副音声フラグ([多])を立てるようにした →きんいろモザイク(AT-X)対応\r
+ ・(Web番組表対応) タイトル/番組詳細に「コメンタリ」の文字があったら副音声フラグ([多])を立てるようにした →きんいろモザイク コメンタリー放送(AT-X)対応\r
  ・(キーワード検索) 検索条件に「副音声/コメンタリ」を追加 \r
- ・(予約ダイアログ) EPG予約を選択した際、マージンが0秒以下なら赤字で警告するようにした\r
+ ・(予約ダイアログ) EPG予約を選択した際、開始・終了マージンが0秒以下なら赤字で警告するようにした\r
+ ・(予約ダイアログ) プログラム予約を選択した際、番組追跡を選択不可に\r
+ ・(予約ダイアログ) EPG予約を選択した際、番組追跡のデフォルト選択を「する」に\r
+ ・(レコーダ対応[EDCB]) 予約ダイアログに表示される、復帰後再起動/録画開始マージン/録画終了マージンの位置を入れ替え ※↑でTvRockと設定の位置をあわせるため\r
  ・(レコーダ対応[TvRock]) 録画結果一覧の取得で、開始・終了時刻と番組名の変更のログを、その他扱いでなくマッチしそうな番組のエントリに追加するようにした ※番組名一致で処理するので漏れる場合もあるはず\r
+ ・(ツールバー[予約一覧取得]) プルダウンメニューのアイテムで、設定が「常に取得しない」になっているものは赤字で強調するようにした\r
+ ・(ツールバー[予約一覧取得]) プルダウンメニューのアイテムに「予約一覧+予約詳細のみ取得」を追加\r
+ ・(web番組表対応[スカパー!]) サブジャンルと字幕フラグの取得に対応\r
 ■バグ修正\r
  ・(その他) SwingWorkerで生成したサブスレッド内で想定外のruntime exceptionが発生するとサブスレッドがログも出さずに死んでしまってエラー原因を調査できなかったが、ログが出るように仕掛けをしたのでその仕掛けがうまく動くようなら今後改善が進んでいくはず\r
  ・(予約ダイアログ) 類似予約テーブルで「類似予約を選択しない」を選んでも、番組ID取得ボタンがリセットされない場合がある問題を修正\r
  ・(レコーダ対応[TvRock]) 録画結果一覧の取得で「予約は実行されませんでした」「ターゲットアプリケーションの異常終了コードを検出しました」が最新のログだと、取得のたびにそのエントリが重複して記録されてしまう問題を修正\r
  ・(レコーダ対応[TvRock]) 録画結果一覧の取得で保存期間の上限を無視してログをため続ける問題を修正\r
  ・(レコーダ対応[TvRock]) 録画結果一覧の取得でその他のログが2行発生する問題を修正 ※ただし、次にその他ログが発生するまでは修正されない\r
+ ・(Web番組表対応) ジャンル=アニメ&番組詳細∋"映画"であるとき、番組詳細∋"映画館"である場合はアニメ映画フラグが立たないように修正\r
+ ・(web番組表対応[スカパー!]) ジャンルが正しくとれない場合があった?問題を修正\r
+ ・(各種設定) 「表示マークの選択」を変更しても、再起動しないと表示に反映されない問題を修正\r
+ ・(レコーダ対応[TvRock]) EPG予約の登録・更新や、予約一覧の再取得で番組IDが'FFFF'にリセットされてしまう問題を修正 ※鯛ナビからEPG予約を登録したもののみ。TvRockに直接入れたものは番組IDがとれないので'FFFF'のまま\r
+ ・(レコーダ対応[TvRock]) TvRockを複数登録している場合に、「コンピュータ名」の項目が正しく設定できない場合があったのを修正\r
 \r
 3.22.1β+1.5.12(2013-05-23)\r
 ■変更点\r
index d0ecba5..8cadf71 100644 (file)
 "CS298 テレ朝チャンネルHD","テレ朝チャンネル"\r
 "CS298 テレ朝チャンネル1 ドラマ・バラエティ・アニメ","テレ朝チャンネル"\r
 \r
+"ファミリー劇場HD", "ファミリー劇場"\r
 "CS293 ファミリー劇場HD", "ファミリー劇場"\r
 \r
 #<<---2012.07.20-ADD---\r
index 72995e8..87a9ac8 100644 (file)
@@ -449,6 +449,11 @@ abstract class AbsReserveDialog extends JDialog implements HDDRecorderListener,R
                        MWin.appendMessage(MSGID+"画質・音質の自動設定候補がありません: "+recId+" & "+selected_key);\r
                }\r
                \r
+               // TvRockではコンピュータ名は指定しない\r
+               if ( "TvRock".equals(recId) ) {\r
+                       myavs.setLvoice(null);\r
+               }\r
+               \r
                return myavs;\r
        }\r
        \r
@@ -483,6 +488,11 @@ abstract class AbsReserveDialog extends JDialog implements HDDRecorderListener,R
                \r
                r.setExec(true);\r
                \r
+               // TvRockではコンピュータ名は指定しない\r
+               if ( "TvRock".equals(recorder.getRecorderId()) ) {\r
+                       r.setRec_lvoice(null);\r
+               }\r
+               \r
                return r;\r
        }\r
        \r
index dbaa58c..59fdd22 100644 (file)
@@ -31,6 +31,7 @@ import javax.swing.ScrollPaneConstants;
 import javax.swing.SpringLayout;\r
 import javax.swing.UIManager;\r
 import javax.swing.border.LineBorder;\r
+import javax.swing.event.CellEditorListener;\r
 import javax.swing.event.ChangeEvent;\r
 import javax.swing.event.ChangeListener;\r
 import javax.swing.event.DocumentEvent;\r
@@ -659,7 +660,7 @@ public abstract class AbsSettingView extends JScrollPane {
                        int marks_h = PARTS_HEIGHT*12; \r
                        CommonSwingUtils.putComponentOn(jPanel_setting, getJLabel_showmarks("表示マークの選択"), LABEL_WIDTH, PARTS_HEIGHT, SEP_WIDTH, y);\r
                        CommonSwingUtils.putComponentOn(jPanel_setting, getJScrollPane_showmarks(), 320, marks_h, LABEL_WIDTH+SEP_WIDTH, y);\r
-                       // RELOADリスナー不要\r
+                       // ★★★ RELOADリスナーは getJScrollPane_showmarks()内でつける\r
                        \r
                        y+=(marks_h+SEP_HEIGHT);\r
                        int cbitems_w = 320;\r
@@ -725,6 +726,8 @@ public abstract class AbsSettingView extends JScrollPane {
                        \r
                        y+=(PARTS_HEIGHT+SEP_HEIGHT);\r
                        CommonSwingUtils.putComponentOn(jPanel_setting, getNoticeMsg("※起動時に、Web番組表の再取得を自動で「実行させたくない」場合は0にしてください。"), DESCRIPTION_WIDTH, PARTS_HEIGHT, SEP_WIDTH*2, y);\r
+                       y+=(PARTS_HEIGHT);\r
+                       CommonSwingUtils.putComponentOn(jPanel_setting, getNoticeMsg("※シャットダウンコマンドを設定すると、Web番組表取得メニューに「CSのみ取得(取得後シャットダウン)」が追加されます。"), DESCRIPTION_WIDTH, PARTS_HEIGHT, SEP_WIDTH*2, y);\r
                        \r
                        y+=(PARTS_HEIGHT+SEP_HEIGHT);\r
                        CommonSwingUtils.putComponentOn(jPanel_setting, jCBP_expandTo8 = new JCheckBoxPanel("可能なら番組表を8日分取得する",LABEL_WIDTH), PARTS_WIDTH, PARTS_HEIGHT, SEP_WIDTH, y);\r
@@ -856,9 +859,12 @@ public abstract class AbsSettingView extends JScrollPane {
                                \r
                                // 選択肢\r
                                updateSelections();\r
+                               \r
+                               y+=(getdetail_h+SEP_HEIGHT);\r
+                               CommonSwingUtils.putComponentOn(jPanel_setting, getNoticeMsg("※「常に取得しない」を選択した場合でも、ツールバーのプルダウンメニューから強制的に取得を実行できます。"), DESCRIPTION_WIDTH, PARTS_HEIGHT, SEP_WIDTH*2, y);\r
                        }\r
                        \r
-                       y+=(getdetail_h+SEP_HEIGHT);\r
+                       y+=(PARTS_HEIGHT+SEP_HEIGHT);\r
                        CommonSwingUtils.putComponentOn(jPanel_setting, jCBX_recordedSaveScope = new JComboBoxPanel("録画結果一覧の保存期間",LABEL_WIDTH,250,true), PARTS_WIDTH, PARTS_HEIGHT, SEP_WIDTH, y);\r
                        jCBX_recordedSaveScope.addItem("保存しない");\r
                        for ( int n=1; n<=HDDRecorder.SCOPEMAX; n++ ) {\r
@@ -1311,7 +1317,18 @@ public abstract class AbsSettingView extends JScrollPane {
                        setUpdateButtonEnhanced(true);\r
                }\r
        };\r
-       \r
+       private final CellEditorListener CEL_RELOAD_PROG_NEEDED = new CellEditorListener() {\r
+               @Override\r
+               public void editingStopped(ChangeEvent e) {\r
+                       if (debug) System.err.println(DBGID+"MODIFIED");\r
+                       setUpdateButtonEnhanced(true);\r
+               }\r
+               \r
+               @Override\r
+               public void editingCanceled(ChangeEvent e) {\r
+               }\r
+       };\r
+\r
        // あいまい検索\r
        ItemListener al_fazzysearch = new ItemListener() {\r
                @Override\r
@@ -1689,7 +1706,12 @@ public abstract class AbsSettingView extends JScrollPane {
                                        return JCheckBox.CENTER;\r
                                }\r
                        });\r
+                       \r
+                       editor.addCellEditorListener(CEL_RELOAD_PROG_NEEDED);\r
+                       \r
+                       //\r
                        jTable_showmarks.getColumn("チェック").setCellEditor(editor);\r
+                       \r
                        // レンダラに手を入れる\r
                        DefaultTableCellRenderer renderer = new DefaultTableCellRenderer() {\r
 \r
index 23aea6a..f5db7b0 100644 (file)
@@ -1,5 +1,6 @@
 package tainavi;\r
 \r
+import java.awt.Color;\r
 import java.awt.Component;\r
 import java.awt.Desktop;\r
 import java.awt.Dimension;\r
@@ -101,9 +102,9 @@ public abstract class AbsToolBar extends JToolBar implements HDDRecorderSelectab
        protected abstract boolean isTabSelected(MWinTab tab);\r
        // 部品\r
        protected abstract boolean addKeywordSearch(SearchKey search);\r
-       protected abstract boolean reLoadTVProgram(LoadFor lf);\r
+       protected abstract boolean doLoadTVProgram(String selected);\r
        \r
-       protected abstract boolean doLoadRdRecorder(LoadRsvedFor lrf);\r
+       protected abstract boolean doLoadRdRecorder(String selected);\r
 \r
        /*******************************************************************************\r
         * 呼び出し元から引き継いだもの\r
@@ -646,11 +647,50 @@ public abstract class AbsToolBar extends JToolBar implements HDDRecorderSelectab
 \r
                jComboBox_select_recorder.addItemListener(il_recorderSelected);\r
        }\r
+       \r
+       /**\r
+        * \r
+        */\r
+       public boolean updateReloadReservedExtension() {\r
+               \r
+               // 消して\r
+               jPopupMenu_reloadrsvedmenu.removeAll();\r
+               \r
+               // 追加する(毎回無視設定のメニューは赤で強調)\r
+               for ( LoadRsvedFor lrf : LoadRsvedFor.values() ) {\r
+                       JMenuItem menuItem = new JMenuItem(lrf.getName());\r
+                       switch ( lrf ) {\r
+                       case DETAILS:\r
+                               if ( env.getForceLoadReserveDetails() == 2 ) {\r
+                                       menuItem.setForeground(Color.RED);\r
+                               }\r
+                               break;\r
+                       case AUTORESERVE:\r
+                               if ( env.getForceLoadAutoReserves() == 2 ) {\r
+                                       menuItem.setForeground(Color.RED);\r
+                               }\r
+                               break;\r
+                       case RECORDED:\r
+                               if ( env.getForceLoadRecorded() == 2 ) {\r
+                                       menuItem.setForeground(Color.RED);\r
+                               }\r
+                               break;\r
+                       default:\r
+                               break;\r
+                       }\r
+                       \r
+                       jPopupMenu_reloadrsvedmenu.add(menuItem);\r
+                       \r
+                       menuItem.addActionListener(al_reloadReservedIndividual);\r
+               }\r
+               \r
+               return true;\r
+       }\r
 \r
        /**\r
         * \r
         */\r
-       public boolean updateReloadProgramExtention() {\r
+       public boolean updateReloadProgramExtension() {\r
                \r
                // 消して\r
                jPopupMenu_reloadprogmenu.removeAll();\r
@@ -820,12 +860,12 @@ public abstract class AbsToolBar extends JToolBar implements HDDRecorderSelectab
        private final MouseListener ml_reloadProgram = new MouseAdapter() {\r
                @Override\r
                public void mouseClicked(MouseEvent e) {\r
-                       reLoadTVProgram(LoadFor.ALL);\r
+                       doLoadTVProgram(null);\r
                }\r
        };\r
        \r
        // 番組表の再取得の拡張メニュー\r
-       private final MouseAdapter ma_reloadProgramExtention = new MouseAdapter() {\r
+       private final MouseAdapter ma_reloadProgramExtension = new MouseAdapter() {\r
                @Override\r
                public void mousePressed(MouseEvent e) {\r
                        jPopupMenu_reloadprogmenu.show(jButton_reloadprogs,0,jButton_reloadprogs.getHeight());\r
@@ -836,22 +876,9 @@ public abstract class AbsToolBar extends JToolBar implements HDDRecorderSelectab
        private final ActionListener al_reloadProgramIndividual = new ActionListener() {\r
                @Override\r
                public void actionPerformed(ActionEvent e) {\r
-                       String selected = ((JMenuItem)e.getSource()).getText();\r
-                       LoadFor lf = LoadFor.get(selected);\r
-                       switch (lf) {\r
-                       case CSwSD: \r
-                               if ( env.isShutdownEnabled() ) {\r
-                                       reLoadTVProgram(LoadFor.CS);\r
-                                       CommonUtils.executeCommand(env.getShutdownCmd());\r
-                               }\r
-                               else {\r
-                                       JOptionPane.showMessageDialog(parent, "シャットダウンコマンドが利用できません");\r
-                               }\r
-                               break;\r
-                       default:\r
-                               reLoadTVProgram(lf);\r
-                               break;\r
-                       }\r
+                       \r
+                       doLoadTVProgram(((JMenuItem)e.getSource()).getText());\r
+                       \r
                }\r
        };\r
        \r
@@ -908,14 +935,14 @@ public abstract class AbsToolBar extends JToolBar implements HDDRecorderSelectab
                @Override\r
                public void actionPerformed(ActionEvent e) {\r
                        \r
-                       doLoadRdRecorder(LoadRsvedFor.get(((JMenuItem)e.getSource()).getText()));\r
+                       doLoadRdRecorder(((JMenuItem)e.getSource()).getText());\r
                        \r
                        fireHDDRecorderChanged();               // 各タブへの反映\r
                }\r
        };\r
 \r
        // 番組表の再取得の拡張メニュー\r
-       private final MouseAdapter ma_reloadReservedExtention = new MouseAdapter() {\r
+       private final MouseAdapter ma_reloadReservedExtension = new MouseAdapter() {\r
                @Override\r
                public void mousePressed(MouseEvent e) {\r
                        jPopupMenu_reloadrsvedmenu.show(jButton_reloadrsved,0,jButton_reloadrsved.getHeight());\r
@@ -1197,11 +1224,11 @@ public abstract class AbsToolBar extends JToolBar implements HDDRecorderSelectab
                        jPopupMenu_reloadprogmenu = new JPopupMenu();\r
 \r
                        // アイテムの登録\r
-                       updateReloadProgramExtention();\r
+                       updateReloadProgramExtension();\r
                        \r
                        ImageIcon arrow = new ImageIcon(ICONFILE_PULLDOWNMENU);\r
                        jButton_reloadprogmenu = new JButton(arrow);\r
-                       jButton_reloadprogmenu.addMouseListener(ma_reloadProgramExtention);\r
+                       jButton_reloadprogmenu.addMouseListener(ma_reloadProgramExtension);\r
                }\r
                return jButton_reloadprogmenu;\r
        }\r
@@ -1260,18 +1287,11 @@ public abstract class AbsToolBar extends JToolBar implements HDDRecorderSelectab
                        jPopupMenu_reloadrsvedmenu = new JPopupMenu();\r
 \r
                        // アイテムの登録\r
-                       {\r
-                               for ( LoadRsvedFor lrf : LoadRsvedFor.values() ) {\r
-                                       JMenuItem menuItem = new JMenuItem(lrf.getName());\r
-                                       jPopupMenu_reloadrsvedmenu.add(menuItem);\r
-                                       \r
-                                       menuItem.addActionListener(al_reloadReservedIndividual);\r
-                               }\r
-                       }\r
+                       updateReloadReservedExtension();\r
                        \r
                        ImageIcon arrow = new ImageIcon(ICONFILE_PULLDOWNMENU);\r
                        jButton_reloadrsvedmenu = new JButton(arrow);\r
-                       jButton_reloadrsvedmenu.addMouseListener(ma_reloadReservedExtention);\r
+                       jButton_reloadrsvedmenu.addMouseListener(ma_reloadReservedExtension);\r
                }\r
                return jButton_reloadrsvedmenu;\r
        }\r
index 7d9e788..79bd5f1 100644 (file)
@@ -185,6 +185,11 @@ public interface HDDRecorder {
         */\r
        \r
        /**\r
+        * 予約一覧をサポートしているかどうか、ってサポートしてないのはカレンダーだけっすよ\r
+        */\r
+       public boolean isReserveListSupported();\r
+       \r
+       /**\r
         * <P>予約一覧へのアクセスだけでは予約の詳細がわからないレコーダなので詳細情報の個別取得が必要か?どうかを返します。\r
         * <P>ただし、これをtrueにするのは個別取得に時間がかかる(旧RD系など)だけで、高速なもの(TvRockやEDCBなど)ではfalseでかまいません。\r
         * @see #GetRdReserveDetails()\r
index 9ce1d85..fabf880 100644 (file)
@@ -51,6 +51,8 @@ public class HDDRecorderUtils implements HDDRecorder,Cloneable {
         ******************************************************************************/\r
        \r
        @Override\r
+       public boolean isReserveListSupported() { return true; }\r
+       @Override\r
        public boolean isThereAdditionalDetails() { return false; }\r
        @Override\r
        public boolean isEditAutoReserveSupported() { return false; }\r
index 73d95d8..6900c54 100644 (file)
@@ -354,29 +354,29 @@ public class PlugIn_CSPSkyperfectTV2012 extends TVProgramUtils implements TVProg
                        String person = "";\r
                        Matcher mb = Pattern.compile("\"(.+?)\":(\\[(.*?)\\]|\"?(.*?)\"?)[,}]").matcher(ma.group(1));\r
                        while ( mb.find() ) {\r
-                               if ( mb.group(1).equals("start") ) {\r
+                               if ( mb.group(1).equals("start") && mb.group(2) != null ) {\r
                                        GregorianCalendar c = new GregorianCalendar();\r
                                        c.setTimeInMillis(Long.valueOf(mb.group(2).replaceFirst("\\.\\d+$", ""))*1000L);\r
                                        pdl.accurateDate = CommonUtils.getDate(c);\r
                                        pdl.startDateTime = CommonUtils.getDateTime(c); \r
                                        pdl.start = CommonUtils.getTime(c).replaceFirst("^.+ ", "");\r
                                }\r
-                               else if ( mb.group(1).equals("end") ) {\r
+                               else if ( mb.group(1).equals("end") && mb.group(2) != null ) {\r
                                        GregorianCalendar c = new GregorianCalendar();\r
                                        c.setTimeInMillis(Long.valueOf(mb.group(2).replaceFirst("\\.\\d+$", ""))*1000L);\r
                                        pdl.endDateTime = CommonUtils.getDateTime(c); \r
                                        pdl.end = CommonUtils.getTime(c).replaceFirst("^.+ ", "");\r
                                }\r
-                               else if ( mb.group(1).equals("title") ) {\r
+                               else if ( mb.group(1).equals("title") && mb.group(4) != null  ) {\r
                                        pdl.title = mb.group(4).replace("\\\"", "\"");\r
                                }\r
-                               else if ( mb.group(1).equals("episode_title") ) {\r
+                               else if ( mb.group(1).equals("episode_title") && mb.group(4) != null  ) {\r
                                        subtitle = mb.group(4);\r
                                }\r
-                               else if ( mb.group(1).equals("explanation") ) {\r
+                               else if ( mb.group(1).equals("explanation") && mb.group(4) != null ) {\r
                                        pdl.detail = mb.group(4).replace("\\\"", "\"").replace("\\n", "\n");\r
                                }\r
-                               else if ( mb.group(1).equals("person") ) {\r
+                               else if ( mb.group(1).equals("person") && mb.group(3) != null ) {\r
                                        String[] d = mb.group(3).split(",");\r
                                        for ( String s : d ) {\r
                                                Matcher mc = Pattern.compile("\"(.+?)\"").matcher(s);\r
@@ -391,36 +391,43 @@ public class PlugIn_CSPSkyperfectTV2012 extends TVProgramUtils implements TVProg
                                else if ( mb.group(1).equals("duration") ) {\r
                                        //pdl.length = Integer.valueOf(mb.group(4))/60; // 使えないっぽい\r
                                }\r
-                               else if ( mb.group(1).equals("genres") ) {\r
-                                       // サブジャンルは無視することにする\r
-                                       String[] d = mb.group(3).split(",");\r
-                                       if ( d.length >= 1 ) {\r
-                                               Matcher mc = Pattern.compile("\"(.+?)\"").matcher(d[0]);\r
-                                               if ( mc.find() ) {\r
-                                                        ProgGenre genre = genremap.get(mc.group(1));\r
-                                                        if ( genre == null ) {\r
-                                                                // 未定義のジャンルです!\r
-                                                                pdl.genre = ProgGenre.NOGENRE;\r
-                                                                gf.put(mc.group(1),null);\r
-                                                        }\r
-                                                        else {\r
-                                                                pdl.genre = genre;\r
-                                                        }\r
+                               else if ( mb.group(1).equals("genres") && mb.group(3) != null ) {\r
+                                       Matcher mc = Pattern.compile("\\[\"(.*?)\",\"(.*?)\"[,\\]]", Pattern.DOTALL).matcher(mb.group(3));\r
+                                       if ( mc.find() ) {\r
+                                               \r
+                                               String grstr = mc.group(1).replaceAll("/", "/");\r
+                                               ProgGenre gr = ProgGenre.get(grstr);\r
+                                               if ( gr == null ) {\r
+                                                       // 未定義のジャンルです!\r
+                                                       gr = ProgGenre.NOGENRE;\r
+                                                       gf.put(mc.group(1),null);\r
                                                }\r
-                                       }\r
-                                       if ( d.length >= 2 ) {\r
-                                               // サブジャンルは使用しないことにする\r
-                                               /*\r
-                                               Matcher mc = Pattern.compile("\"(.+?)\"").matcher(d[1]);\r
-                                               if ( mc.find() ) {\r
-                                                       String subgenrestr = mc.group(1);\r
+                                               if ( pdl.genre == null || (pdl.genre == ProgGenre.NOGENRE && gr != ProgGenre.NOGENRE) ) {\r
+                                                       pdl.genre = gr;\r
                                                }\r
-                                               */\r
+                                               \r
+                                               String sgstr = mc.group(2).replaceAll("ィー", "ィ");\r
+                                               ProgSubgenre sg = ProgSubgenre.get(gr, sgstr);\r
+                                               if ( sg == null ) {\r
+                                                       // 未定義のサブジャンルです!\r
+                                                       ArrayList<ProgSubgenre> vals = ProgSubgenre.values(gr);\r
+                                                       sg = vals.get(vals.size()-1);\r
+                                               }\r
+                                               pdl.subgenre = sg;\r
+                                       }\r
+                                       else {\r
+                                               pdl.genre = ProgGenre.NOGENRE;\r
+                                               pdl.subgenre = ProgSubgenre.NOGENRE_ETC;\r
                                        }\r
                                }\r
-                               else if ( mb.group(1).equals("no_scramble") ) {\r
+                               else if ( mb.group(1).equals("no_scramble") && mb.group(4) != null ) {\r
                                        pdl.noscrumble = (mb.group(4).equals("ノンスクランブル"))?(ProgScrumble.NOSCRUMBLE):(ProgScrumble.SCRUMBLED);\r
                                }\r
+                               else if ( mb.group(1).equals("caption_dubbing") && mb.group(4) != null ) {\r
+                                       if ( mb.group(4).contains("字幕") ) {\r
+                                               pdl.option.add(ProgOption.SUBTITLE);\r
+                                       }\r
+                               }\r
                        }\r
                        \r
                        // 算出してみる\r
index a67b604..21652cc 100644 (file)
@@ -41,6 +41,8 @@ public class PlugIn_RecGoogleCalendar extends HDDRecorderUtils implements HDDRec
        public RecType getType() { return RecType.CALENDAR; }\r
        \r
        @Override\r
+       public boolean isReserveListSupported() { return false; }\r
+       @Override\r
        public boolean isBackgroundOnly() { return true; }\r
        \r
        /*******************************************************************************\r
index 87416b1..82fc14d 100644 (file)
@@ -74,11 +74,11 @@ public class PlugIn_RecRD_EDCB extends HDDRecorderUtils implements HDDRecorder,C
        @Override\r
        public String getLabel_Device() { return "指定サービス対象"; }\r
        @Override\r
-       public String getLabel_XChapter() { return "録画開始(秒前)"; }\r
+       public String getLabel_XChapter() { return "復帰後再起動"; }              // [mv->x]\r
        @Override\r
-       public String getLabel_MsChapter() { return "録画終了(秒後)"; }\r
+       public String getLabel_MsChapter() { return "録画開始(秒前)"; }   // [x->ms]\r
        @Override\r
-       public String getLabel_MvChapter() { return "復帰後再起動"; }\r
+       public String getLabel_MvChapter() { return "録画終了(秒後)"; }   // [ms->mv]\r
        @Override\r
        public String getLabel_DVDCompat() { return "連続録画動作"; }\r
        @Override\r
@@ -210,17 +210,17 @@ public class PlugIn_RecRD_EDCB extends HDDRecorderUtils implements HDDRecorder,C
        private String getTextSuspendMode(ReserveList r)                        { return r.getRec_aspect(); }\r
        private void setTextSuspendMode(ReserveList r, String text)     { r.setRec_aspect(text); }\r
        \r
-       private ArrayList<TextValueSet> getListRebootFlag()                     { return mvchapter; }   // 復帰後再起動する\r
-       private String getTextRebootFlag(ReserveList r)                         { return r.getRec_mvchapter(); }\r
-       private void setTextRebootFlag(ReserveList r, String text)      { r.setRec_mvchapter(text); }\r
+       private ArrayList<TextValueSet> getListRebootFlag()                     { return xchapter; }    // 復帰後再起動する [mv->x]\r
+       private String getTextRebootFlag(ReserveList r)                         { return r.getRec_xchapter(); }\r
+       private void setTextRebootFlag(ReserveList r, String text)      { r.setRec_xchapter(text); }\r
        \r
-       private ArrayList<TextValueSet> getListStartMargine()           { return xchapter; }    // 録画マージン(開始)\r
-       private String getTextStartMargine(ReserveList r)                       { return r.getRec_xchapter(); }\r
-       private void setTextStartMargine(ReserveList r, String text){ r.setRec_xchapter(text); }\r
+       private ArrayList<TextValueSet> getListStartMargine()           { return mschapter; }   // 録画マージン(開始) [x->ms]\r
+       private String getTextStartMargine(ReserveList r)                       { return r.getRec_mschapter(); }\r
+       private void setTextStartMargine(ReserveList r, String text){ r.setRec_mschapter(text); }\r
        \r
-       private ArrayList<TextValueSet> getListEndMargine()                     { return mschapter; }   // 録画マージン(終了)\r
-       private String getTextEndMargine(ReserveList r)                         { return r.getRec_mschapter(); }\r
-       private void setTextEndMargine(ReserveList r, String text)      { r.setRec_mschapter(text); }\r
+       private ArrayList<TextValueSet> getListEndMargine()                     { return mvchapter; }   // 録画マージン(終了) [ms->mv]\r
+       private String getTextEndMargine(ReserveList r)                         { return r.getRec_mvchapter(); }\r
+       private void setTextEndMargine(ReserveList r, String text)      { r.setRec_mvchapter(text); }\r
        \r
        private ArrayList<TextValueSet> getListContinueRecFlag()        { return dvdcompat; }           // 連続録画動作\r
        private String getTextContinueRecFlag(ReserveList r)            { return r.getRec_dvdcompat(); }\r
@@ -441,6 +441,25 @@ public class PlugIn_RecRD_EDCB extends HDDRecorderUtils implements HDDRecorder,C
                if ( force == false && f.exists() ) {\r
                        // キャッシュから読み出し(予約一覧)\r
                        setReserves(ReservesFromFile(rsvedFile));\r
+                       \r
+                       // 3種の入れ替え(しばらくしたら削除する)\r
+                       {\r
+                               boolean modified = false;\r
+                               for ( ReserveList r : getReserves() ) {\r
+                                       if ( ITEM_YES.equals(r.getRec_mvchapter()) || ITEM_NO.equals(r.getRec_mvchapter()) ) {\r
+                                               String s = r.getRec_mvchapter();\r
+                                               r.setRec_mvchapter(r.getRec_mschapter());\r
+                                               r.setRec_mschapter(r.getRec_xchapter());\r
+                                               r.setRec_xchapter(s);\r
+                                               \r
+                                               modified = true;\r
+                                       }\r
+                               }\r
+                               if ( modified ) {\r
+                                       ReservesToFile(getReserves(), rsvedFile);       // キャッシュに保存\r
+                               }\r
+                       }\r
+                       \r
                        replaceChNames(cc);\r
                        if (getDebug()) ShowReserves(getReserves());\r
 \r
index cbae688..243fb06 100644 (file)
@@ -8,7 +8,6 @@ import java.util.ArrayList;
 import java.util.Calendar;\r
 import java.util.GregorianCalendar;\r
 import java.util.HashMap;\r
-import java.util.Map.Entry;\r
 import java.util.regex.Matcher;\r
 import java.util.regex.Pattern;\r
 \r
@@ -482,8 +481,12 @@ public class PlugIn_RecRD_TvRock extends HDDRecorderUtils implements HDDRecorder
                // レコーダから読み出し(予約一覧)\r
                ArrayList<ReserveList> newReserveList = new ArrayList<ReserveList>();\r
                if ( ! GetRdReservedList(newReserveList) ) {\r
-                       return(false);\r
+                       return false;\r
                }\r
+               if ( ! GetRdReservedDetails(newReserveList) ) {\r
+                       return false;\r
+               }\r
+               \r
                setReserves(newReserveList);\r
                ReservesToFile(getReserves(), rsvedFile);       // キャッシュに保存\r
 \r
@@ -666,27 +669,47 @@ public class PlugIn_RecRD_TvRock extends HDDRecorderUtils implements HDDRecorder
                                // チューナー重複警告\r
                                entry.setTunershort(tunershort);\r
                                \r
-                               // タイトル自動補完フラグなど本体からは取得できない情報を引き継ぐ\r
-                               copyAttributes(entry, getReserves());\r
-                               \r
                                // 予約情報を保存\r
                                newReserveList.add(entry);\r
                        }\r
                }\r
+               \r
+               return true;\r
+       }\r
+       \r
 \r
-               // 予約詳細を追加取得する\r
+       // 予約詳細を追加取得する\r
+       private boolean GetRdReservedDetails(ArrayList<ReserveList> newReserveList) {\r
                int cnt = 0;\r
-               for (ReserveList r : newReserveList) {\r
+               for ( ReserveList r : newReserveList ) {\r
                        // 進捗状況を報告する\r
                        ++cnt;\r
                        reportProgress("+番組詳細を取得します("+cnt+"/"+newReserveList.size()+")");\r
-                       getReserveDetail(r);\r
+                       if ( ! getReserveDetail(r) ) {\r
+                               return false;\r
+                       }\r
+                       \r
+                       // 情報の引き継ぎ\r
+                       for ( ReserveList ro : getReserves() ) {\r
+                               if ( ro.getId().equals(r.getId()) ) {\r
+                                       r.setRec_genre(ro.getRec_genre());\r
+                                       r.setRec_subgenre(ro.getRec_subgenre());\r
+                                       if (\r
+                                                       ro.getDetail() != null &&\r
+                                                       (r.getDetail() == null || r.getDetail().length() < ro.getDetail().length()) ) {\r
+                                               r.setDetail(ro.getDetail());\r
+                                       }\r
+                                       if ( ! ContentIdEDCB.decodeContentId(r.getContentId()) || ContentIdEDCB.getEvId() == 0xFFFF ) {\r
+                                               r.setContentId(ro.getContentId());\r
+                                       }\r
+                                       break;\r
+                               }\r
+                       }\r
                }\r
                \r
                return true;\r
        }\r
        \r
-       \r
        /**\r
         * 予約詳細を取得する\r
         */\r
@@ -744,7 +767,9 @@ public class PlugIn_RecRD_TvRock extends HDDRecorderUtils implements HDDRecorder
                                        getPattern(r,res);\r
                                        r.setPursues(false);\r
                                }\r
-                               r.setContentId(ContentIdEDCB.getContentId(0xFFFF,0xFFFF,0xFFFF,0xFFFF));\r
+                               if ( r.getContentId() == null || r.getContentId().length() == 0 ) {\r
+                                       r.setContentId(ContentIdEDCB.getContentId(0xFFFF,0xFFFF,0xFFFF,0xFFFF));\r
+                               }\r
                                r.setRec_audio(ITEM_REC_TYPE_EPG);\r
                        }\r
                        else {\r
@@ -971,9 +996,7 @@ public class PlugIn_RecRD_TvRock extends HDDRecorderUtils implements HDDRecorder
                        \r
                        // 期限切れの情報のカット\r
                        ArrayList<RecordedInfo> removeList = new ArrayList<RecordedInfo>();\r
-                       int index=0;\r
-                       for ( ; index < newRecordedList.size(); index++ ) {\r
-                               RecordedInfo entry = newRecordedList.get(index);\r
+                       for ( RecordedInfo entry : newRecordedList ) {\r
                                if ( ! entry.getDate().equals(RECORDED_SPDATE) && entry.getDate().compareTo(cutDate) < 0 ) {\r
                                        removeList.add(entry);\r
                                }\r
index 5ad47c8..abe4b40 100644 (file)
@@ -111,7 +111,7 @@ public class RecSettingEditorPanel extends JPanel {
                setGenreItems();\r
                \r
                // 付けたり外したりしないリスナー\r
-               jCBXPanel_genre.addItemListener(f_il_resetSubgenreItems);\r
+               jCBXPanel_genre.addItemListener(f_il_genreSelected);\r
                \r
                jButton_load.addActionListener(f_al_loadAction);\r
                jButton_save.addActionListener(f_al_saveAction);\r
@@ -608,6 +608,7 @@ public class RecSettingEditorPanel extends JPanel {
                if ( genre == null || genre.length() == 0 ) {\r
                        genre = ProgGenre.NOGENRE.toString();\r
                }\r
+               jCBXPanel_genre.setSelectedItem(null);\r
                jCBXPanel_genre.setSelectedItem(genre);\r
                \r
                if ( subgenre == null || subgenre.length() == 0 ) {\r
@@ -625,14 +626,17 @@ public class RecSettingEditorPanel extends JPanel {
         */\r
        private String setSelectedValue(JComboBoxPanel comp, String value) {\r
                \r
-               if ( value != null ) {\r
+               if ( value != null && value.length() > 0 ) {\r
+                       comp.setSelectedItem(null);\r
                        comp.setSelectedItem(value);\r
                }\r
                else if ( comp.getItemCount() > 0 ){\r
+                       comp.setSelectedItem(null);\r
                        comp.setSelectedIndex(0);\r
                }\r
                \r
-               return (String) comp.getSelectedItem();\r
+               String s = (String) comp.getSelectedItem();\r
+               return s;\r
        }\r
        \r
        /*******************************************************************************\r
@@ -722,48 +726,21 @@ public class RecSettingEditorPanel extends JPanel {
         * 永続的なリスナー\r
         **************************************/\r
        \r
-       private final ItemListener f_il_resetSubgenreItems = new ItemListener() {\r
+       /**\r
+        * ジャンルを選択したらサブジャンルの選択肢を入れ替える\r
+        */\r
+       private final ItemListener f_il_genreSelected = new ItemListener() {\r
                @Override\r
                public void itemStateChanged(ItemEvent e) {\r
                        // サブジャンルのアイテムをリセットする\r
-                       setSubgenreItems(ProgGenre.get((String) jCBXPanel_genre.getSelectedItem()));\r
-               }\r
-       };\r
-       \r
-       /**\r
-        * ジャンル別AV設定のロード\r
-        */\r
-       private final ActionListener f_al_loadAction = new ActionListener() {\r
-               public void actionPerformed(ActionEvent e) {\r
-                       if ( recsetsel != null ) {\r
-                               setEnabledListenerAll(false);\r
-                               \r
-                               recsetsel.doSetAVSettings();\r
-\r
-                               setEnabledListenerAll(true);\r
+                       String gstr = (String) jCBXPanel_genre.getSelectedItem();\r
+                       if ( gstr != null ) {\r
+                               setSubgenreItems(ProgGenre.get(gstr));\r
                        }\r
                }\r
        };\r
        \r
        /**\r
-        * ジャンル別AV設定のセーブ\r
-        */\r
-       private final ActionListener f_al_saveAction = new ActionListener() {\r
-               public void actionPerformed(ActionEvent e) {\r
-                       if ( recsetsel != null ) recsetsel.doSaveAVSettings(false);\r
-               }\r
-       };\r
-       \r
-       /**\r
-        * 既定AV設定のセーブ\r
-        */\r
-       private final ActionListener f_al_saveDefaultAction = new ActionListener() {\r
-               public void actionPerformed(ActionEvent e) {\r
-                       if ( recsetsel != null ) recsetsel.doSaveAVSettings(true);\r
-               }\r
-       };\r
-       \r
-       /**\r
         * EPG予約以外では番組追従が設定できないようにしたいな\r
         */\r
        private final ItemListener f_il_arateChanged = new ItemListener() {\r
@@ -786,7 +763,10 @@ public class RecSettingEditorPanel extends JPanel {
                        else {\r
                                if ( pgtype == HDDRecorder.ITEM_REC_TYPE_EPG ) {\r
                                        try {\r
+                                               jCBXPanel_pursues.setSelectedItem(ITEM_YES);    // EPG予約にするなら追従ありがデフォルトでいいだろ?\r
+                                               \r
                                                if ( Integer.valueOf((String) jCBXPanel_msChapter.getSelectedItem()) <= 0 ) {\r
+                                                       // 開始マージン0は危ないよね\r
                                                        jCBXPanel_msChapter.setLabelForeground(Color.RED);\r
                                                }\r
                                        }\r
@@ -795,6 +775,7 @@ public class RecSettingEditorPanel extends JPanel {
                                        }\r
                                        try {\r
                                                if ( Integer.valueOf((String) jCBXPanel_mvChapter.getSelectedItem()) <= 0 ) {\r
+                                                       // 終了マージン0は危ないよね\r
                                                        jCBXPanel_mvChapter.setLabelForeground(Color.RED);\r
                                                }\r
                                        }\r
@@ -806,6 +787,39 @@ public class RecSettingEditorPanel extends JPanel {
                }\r
        };\r
        \r
+       /**\r
+        * ジャンル別AV設定のロード\r
+        */\r
+       private final ActionListener f_al_loadAction = new ActionListener() {\r
+               public void actionPerformed(ActionEvent e) {\r
+                       if ( recsetsel != null ) {\r
+                               setEnabledListenerAll(false);\r
+                               \r
+                               recsetsel.doSetAVSettings();\r
+\r
+                               setEnabledListenerAll(true);\r
+                       }\r
+               }\r
+       };\r
+       \r
+       /**\r
+        * ジャンル別AV設定のセーブ\r
+        */\r
+       private final ActionListener f_al_saveAction = new ActionListener() {\r
+               public void actionPerformed(ActionEvent e) {\r
+                       if ( recsetsel != null ) recsetsel.doSaveAVSettings(false);\r
+               }\r
+       };\r
+       \r
+       /**\r
+        * 既定AV設定のセーブ\r
+        */\r
+       private final ActionListener f_al_saveDefaultAction = new ActionListener() {\r
+               public void actionPerformed(ActionEvent e) {\r
+                       if ( recsetsel != null ) recsetsel.doSaveAVSettings(true);\r
+               }\r
+       };\r
+       \r
 \r
        /***************************************\r
         * つけたり外したりするリスナーをつけたり外したりするメソッド\r
index b3dfcdf..d607136 100644 (file)
@@ -200,6 +200,7 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener,H
         */\r
        public static enum LoadRsvedFor {\r
 //             SETTING         ( "設定情報のみ取得(future use.)" ),\r
+               DETAILS         ( "予約一覧+録画詳細のみ取得" ),\r
                RECORDED        ( "録画結果一覧のみ取得" ),\r
                AUTORESERVE     ( "自動予約一覧のみ取得" ),\r
                ;\r
@@ -837,88 +838,8 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener,H
                        //listed.pauseTimer();\r
                        timer_now.pause();\r
                        \r
-                       bounds.save();\r
-                       cbitems.save();\r
-                       env.save();\r
-\r
-                       // CommonUtilsの設定変更\r
-                       CommonUtils.setAdjLateNight(env.getAdjLateNight());\r
-                       CommonUtils.setExpandTo8(env.getExpandTo8());\r
-                       CommonUtils.setUseRundll32(env.getUseRundll32());\r
-                       CommonUtils.setDisplayPassedReserve(env.getDisplayPassedReserve());\r
-                       CommonUtils.setDebug(env.getDebug());\r
-                       \r
-                       SwingBackgroundWorker.setDebug(env.getDebug());\r
-\r
-                       // ほにゃらら\r
-                       toolBar.setDebug(env.getDebug());\r
-                       autores.setDebug(env.getDebug());\r
-\r
-                       // PassedProgramListの設定変更\r
-                       tvprograms.getPassed().setPassedDir(env.getPassedDir());\r
-\r
-                       // レコーダプラグインの設定変更\r
-                       for ( HDDRecorder rec : recorders ) {\r
-                               // 拡張設定だけ\r
-                               setSettingRecPluginExt(rec, env);\r
-                       }\r
-\r
-                       // Web番組表共通設定\r
-                       setSettingProgPluginCommon(env);\r
-                       \r
-                       // web番組表のリフレッシュ\r
-                       setSettingProgPluginAll(env);\r
+                       Viewer.this.setEnv(reload_prog);\r
                        \r
-                       // リロードメニューの書き換え\r
-                       toolBar.updateReloadProgramExtention();\r
-                       \r
-                       // ページャーコンボボックスの書き換え\r
-                       toolBar.setPagerItems();\r
-                       \r
-                       // 列の表示・非表示\r
-                       listed.setMarkColumnVisible(env.getSplitMarkAndTitle());\r
-                       listed.setDetailColumnVisible(env.getShowDetailOnList());\r
-                       listed.setRowHeaderVisible(env.getRowHeaderVisible());\r
-                       reserved.setRowHeaderVisible(env.getRowHeaderVisible());\r
-                       \r
-                       // 強調色\r
-                       listed.setMatchedKeywordColor(env.getMatchedKeywordColor());\r
-                       listed.setRsvdLineColor((env.getRsvdLineEnhance())?(env.getRsvdLineColor()):(null));\r
-                       listed.setPickedLineColor((env.getRsvdLineEnhance())?(env.getPickedLineColor()):(null));\r
-                       listed.setCurrentLineColor((env.getCurrentLineEnhance())?(env.getCurrentLineColor()):(null));\r
-                       \r
-                       // システムトレイアイコン\r
-                       setTrayIconVisible(env.getShowSysTray());\r
-                       setXButtonAction(env.getShowSysTray() && env.getHideToTray());\r
-                       \r
-                       // 新聞形式のツールチップの表示時間を変更する\r
-                       setTooltipDelay();\r
-                       \r
-                       // Web番組表の再構築\r
-                       mpList.setHistoryOnlyUpdateOnce(env.getHistoryOnlyUpdateOnce());\r
-                       mpList.setShowOnlyNonrepeated(env.getShowOnlyNonrepeated());\r
-                       \r
-                       // 番組情報の再取得\r
-                       if ( reload_prog ) {\r
-                               loadTVProgram(false,LoadFor.ALL);       // 部品呼び出し\r
-                       }\r
-                       \r
-                       // 新聞描画枠のリセット\r
-                       paper.clearPanel();\r
-                       paper.buildMainViewByDate();\r
-                       \r
-                       // 再度ツリーの再構築\r
-                       paper.redrawTreeByDate();\r
-                       paper.redrawTreeByPassed();\r
-                       \r
-                       listed.redrawTreeByHistory();\r
-                       listed.redrawTreeByCenter();\r
-                       \r
-                       // 再描画\r
-                       paper.reselectTree();\r
-                       listed.reselectTree();\r
-\r
-                       //listed.continueTimer();       // まあreselectTree()で再開しているはずだが\r
                        timer_now.start();\r
                }\r
        }\r
@@ -1449,52 +1370,9 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener,H
                        \r
                        timer_now.pause();\r
                        \r
-                       try {\r
-                               String fname;\r
-                               if ( mainWindow.isTabSelected(MWinTab.LISTED) ) {\r
-                                       fname = String.format("snapshot.%s",env.getSnapshotFmt().getExtension());\r
-                                       CommonSwingUtils.saveComponentAsJPEG(listed.getCurrentView(), listed.getTableHeader(), null, listed.getTableBody(), fname, env.getSnapshotFmt(), Viewer.this);\r
-                               }\r
-                               else if ( mainWindow.isTabSelected(MWinTab.PAPER) ){\r
-                                       if ( env.getDrawcacheEnable() || ! env.isPagerEnabled() ) {\r
-                                               fname = String.format("snapshot.%s",env.getSnapshotFmt().getExtension());\r
-                                       }\r
-                                       else {\r
-                                               int pcur = getSelectedPagerIndex();\r
-                                               int pmax = getPagerCount();\r
-                                               if ( env.getAllPageSnapshot() ) {\r
-                                                       for ( int i=0; i<pmax; i++ ) {\r
-                                                               if ( i != pcur ) {\r
-                                                                       setSelectedPagerIndex(i);\r
-                                                                       fname = String.format("snapshot%02d.%s",i+1,env.getSnapshotFmt().getExtension());\r
-                                                                       CommonSwingUtils.saveComponentAsJPEG(paper.getCurrentView(), paper.getCenterPane(), paper.getTimebarPane(), paper.getCurrentPane(), fname, env.getSnapshotFmt(), Viewer.this);\r
-                                                               }\r
-                                                       }\r
-                                               }\r
-                                               fname = String.format("snapshot%02d.%s",pcur+1,env.getSnapshotFmt().getExtension());\r
-                                               setSelectedPagerIndex(pcur);\r
-                                       }\r
-                                       CommonSwingUtils.saveComponentAsJPEG(paper.getCurrentView(), paper.getCenterPane(), paper.getTimebarPane(), paper.getCurrentPane(), fname, env.getSnapshotFmt(), Viewer.this);\r
-                               }\r
-                               else {\r
-                                       return; // おかしーよ\r
-                               }\r
-                               Desktop desktop = Desktop.getDesktop();\r
-                               if (env.getPrintSnapshot()) {\r
-                                       desktop.print(new File(fname));\r
-                               }\r
-                               else {\r
-                                       String emsg = CommonUtils.openFile(fname);\r
-                                       if (emsg != null) {\r
-                                               mwin.appendError(emsg);\r
-                                       }\r
-                               }\r
-                       } catch (IOException e1) {\r
-                               e1.printStackTrace();\r
-                       }\r
-                       finally {\r
-                               timer_now.start();\r
-                       }\r
+                       Viewer.this.getSnapshot(getSelectedPagerIndex(),getPagerCount());\r
+                       \r
+                       timer_now.start();\r
                }\r
 \r
                @Override\r
@@ -1545,25 +1423,35 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener,H
                }\r
 \r
                @Override\r
-               protected boolean reLoadTVProgram(LoadFor lf) {\r
+               protected boolean doLoadTVProgram(String selected) {\r
                        timer_now.pause();\r
-                       boolean b = Viewer.this.reLoadTVProgram(lf);\r
+                       \r
+                       LoadFor lf = (selected != null) ? LoadFor.get(selected) : LoadFor.ALL;\r
+                       boolean b = Viewer.this.doLoadTVProgram(true, lf);\r
+                       \r
+                       if ( b && lf == LoadFor.CSwSD ) {\r
+                               // ロード後シャットダウン\r
+                               CommonUtils.executeCommand(env.getShutdownCmd());\r
+                       }\r
+\r
+                       Viewer.this.doRedrawTVProgram();        // か き な お し\r
+\r
                        timer_now.start();\r
                        return b;\r
                }\r
 \r
                @Override\r
-               protected boolean doLoadRdRecorder(LoadRsvedFor lrf) {\r
+               protected boolean doLoadRdRecorder(String selected) {\r
                        timer_now.pause();\r
                        \r
-                       boolean b = Viewer.this.doLoadRdRecorder(lrf);;\r
+                       LoadRsvedFor lrf = (selected != null) ? LoadRsvedFor.get(selected) : null;\r
+                       boolean b = Viewer.this.doLoadRdRecorder(lrf);\r
                        \r
                        timer_now.start();\r
                        return b;\r
                }\r
        }\r
        \r
-       \r
        /*******************************************************************************\r
         * ハンドラ―メソッド\r
         ******************************************************************************/\r
@@ -1695,7 +1583,11 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener,H
                        }\r
                        \r
                        JMenuItem menuItem = new JMenuItem(String.format("%s【%s %s - %s(%s)】",target,tvd.accurateDate,tvd.start,tvd.title,tvd.center));\r
-                       menuItem.setForeground(new Color(0,127,0));\r
+                       {\r
+                               menuItem.setForeground(Color.BLUE);\r
+                               Font f = menuItem.getFont();\r
+                               menuItem.setFont(f.deriveFont(f.getStyle()|Font.BOLD));\r
+                       }\r
                        \r
                        menuItem.addActionListener(new ActionListener() {\r
                                public void actionPerformed(ActionEvent e) {\r
@@ -2613,13 +2505,9 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener,H
                return null;\r
        }\r
        \r
-       /*******************************************************************************\r
-        * タイマー関連\r
-        ******************************************************************************/\r
-       \r
                \r
        /*******************************************************************************\r
-        * ã\81\93ã\81\93ã\81\8bã\82\89ã\81\8aã\81\8aã\82\80ã\81­å\88\9dæ\9c\9få\8c\96å\87¦ç\90\86ã\81«ã\81\8bã\81\8bã\82\8fã\82\8bã\83¡ã\82½ã\83\83ã\83\89群\r
+        * ã\83¬ã\82³ã\83¼ã\83\80ã\81®äº\88ç´\84æ\83\85å ±ã\82\92DLã\81\99ã\82\8b\r
         ******************************************************************************/\r
        \r
        /***************************************\r
@@ -2636,6 +2524,8 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener,H
                }\r
                else {\r
                        switch (lrf) {\r
+                       case DETAILS:\r
+                               return doLoadRdReserveDetails();\r
                        case RECORDED:\r
                                return doLoadRdRecorded();\r
                        case AUTORESERVE:\r
@@ -2692,6 +2582,97 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener,H
                return true;\r
        }\r
        \r
+       \r
+       /**\r
+        * 予約一覧+予約詳細をDLする\r
+        */\r
+       private boolean doLoadRdReserveDetails() {\r
+               \r
+               final String myself = getSelectedMySelf();\r
+               \r
+               //\r
+               StWinClear();\r
+               \r
+               new SwingBackgroundWorker(false) {\r
+                       \r
+                       @Override\r
+                       protected Object doWorks() throws Exception {\r
+                               \r
+                               TatCount tc = new TatCount();\r
+                       \r
+                               boolean succeeded = true;\r
+                               \r
+                               HDDRecorderList recs;\r
+                               if ( myself != null ) {\r
+                                       recs = recorders.findInstance(myself);\r
+                               }\r
+                               else {\r
+                                       recs = recorders;\r
+                               }\r
+                               for ( HDDRecorder recorder : recs ) {\r
+                                       \r
+                                       if ( ! recorder.isReserveListSupported() ) {\r
+                                               continue;\r
+                                       }\r
+                                       \r
+                                       // 各種設定の取得\r
+                                       if ( ! recorder.GetRdSettings(true) ) {\r
+                                               succeeded = false;\r
+                                               continue;\r
+                                       }\r
+                                       \r
+                                       // 予約一覧の取得\r
+                                       if ( ! recorder.GetRdReserve(true) ) {\r
+                                               succeeded = false;\r
+                                               continue;\r
+                                       }\r
+                                       \r
+                                       // レコーダから取得したエンコーダ情報で、登録済みレコーダ一覧を更新する\r
+                                       setEncoderInfo2RecorderList(recorder,true);\r
+                                       \r
+                                       // 予約詳細の取得\r
+                                       if ( recorder.isThereAdditionalDetails() ) {\r
+                                               if ( ! recorder.GetRdReserveDetails() ) {\r
+                                                       succeeded = false;\r
+                                                       continue;\r
+                                               }\r
+                                       }\r
+                                       \r
+                                       // レコーダの放送局名をWeb番組表の放送局名に置き換え\r
+                                       checkChNameIsRight(recorder);\r
+                                       \r
+                                       // 録画結果一覧を予約一覧に反映\r
+                                       if ( recorder.isRecordedListSupported() ) {\r
+                                               recorder.GetRdRecorded(false);\r
+                                       }\r
+                               }\r
+                               \r
+                               if ( succeeded ) {\r
+                                       reserved.redrawReservedList();\r
+                                       recorded.redrawRecordedList();\r
+                                       \r
+                                       mwin.appendMessage(String.format("【予約詳細の取得処理が完了しました】 所要時間: %.2f秒",tc.end()));\r
+                               }\r
+                               else {\r
+                                       ringBeep();\r
+                                       mwin.appendMessage(String.format("【予約詳細の取得処理に失敗しました】 所要時間: %.2f秒",tc.end()));\r
+                               }\r
+                               return null;\r
+                       }\r
+                       \r
+                       @Override\r
+                       protected void doFinally() {\r
+                               StWinSetVisible(false);\r
+                       }\r
+               }.execute();\r
+               \r
+               StWinSetLocationCenter(this);\r
+               StWinSetVisible(true);\r
+               \r
+               return true;\r
+       }\r
+       \r
+       \r
        /**\r
         * 録画結果一覧をDLする\r
         */\r
@@ -2709,7 +2690,7 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener,H
                                \r
                                TatCount tc = new TatCount();\r
                        \r
-                               boolean succeeded = false;\r
+                               boolean succeeded = true;\r
                                \r
                                HDDRecorderList recs;\r
                                if ( myself != null ) {\r
@@ -2720,11 +2701,12 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener,H
                                }\r
                                for ( HDDRecorder recorder : recs ) {\r
                                        if ( ! recorder.isRecordedListSupported() ) {\r
+                                               succeeded = false;\r
                                                continue;\r
                                        }\r
 \r
-                                       if ( recorder.GetRdRecorded(true) ) {\r
-                                               succeeded = true;\r
+                                       if ( recorder.GetRdRecorded(true) ) {\r
+                                               succeeded = false;\r
                                        }\r
                                }\r
                                \r
@@ -2753,6 +2735,7 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener,H
                return true;\r
        }\r
 \r
+\r
        /**\r
         * 録画結果一覧をDLする\r
         */\r
@@ -2770,7 +2753,7 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener,H
                                \r
                                TatCount tc = new TatCount();\r
                        \r
-                               boolean succeeded = false;\r
+                               boolean succeeded = true;\r
                                \r
                                HDDRecorderList recs;\r
                                if ( myself != null ) {\r
@@ -2781,11 +2764,12 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener,H
                                }\r
                                for ( HDDRecorder recorder : recs ) {\r
                                        if ( ! recorder.isEditAutoReserveSupported() ) {\r
+                                               succeeded = false;\r
                                                continue;\r
                                        }\r
                                        \r
-                                       if ( recorder.GetRdAutoReserve(true) ) {\r
-                                               succeeded = true;\r
+                                       if ( recorder.GetRdAutoReserve(true) ) {\r
+                                               succeeded = false;\r
                                        }\r
                                }\r
                                \r
@@ -2854,15 +2838,8 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener,H
                boolean success = true;\r
                \r
                for ( HDDRecorder recorder : recs ) {\r
-                       switch ( recorder.getType() ) {\r
-                       case RECORDER:\r
-                       case EPG:\r
-                       case MAIL:\r
-                       case NULL:\r
-                       case TUNER:\r
+                       if ( recorder.isReserveListSupported() ) {\r
                                success = success & _loadRdRecorder(recorder, force);\r
-                       default:\r
-                               break;\r
                        }\r
                }\r
                \r
@@ -3093,16 +3070,21 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener,H
                }\r
        }\r
        \r
+       /*******************************************************************************\r
+        * Web番組表をDLする\r
+        ******************************************************************************/\r
+       \r
        /***************************************\r
-        * Web番組表を取得す\r
+        * ツールバートリガー(と、各種設定変更トリガー)によ\r
         **************************************/\r
        \r
        /**\r
-        * Web番組表をDLする\r
+        * Web番組表をDL→再描画まで\r
         * <P>単体実行の場合はこちらを呼び出す\r
         * <P>部品実行の場合はこちらを呼び出す:{@link #loadTVProgram(boolean, LoadFor)}\r
+        * @see #doRedrawTVProgram()\r
         */\r
-       private boolean reLoadTVProgram(final LoadFor lf) {\r
+       private boolean doLoadTVProgram(final boolean force, final LoadFor lf) {\r
                //\r
                StWinClear();\r
                \r
@@ -3113,18 +3095,7 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener,H
                                \r
                                TatCount tc = new TatCount();\r
                                \r
-                               loadTVProgram(true, lf);\r
-                               \r
-                               // 新聞描画枠のリセット\r
-                               paper.clearPanel();\r
-                               paper.buildMainViewByDate();\r
-                               \r
-                               // サイドツリーの再構築\r
-                               paper.redrawTreeByPassed();\r
-                               \r
-                               // 再描画\r
-                               paper.reselectTree();\r
-                               listed.reselectTree();\r
+                               loadTVProgram(force, lf);\r
                                \r
                                mwin.appendMessage(String.format("[Web番組表取得] 【完了しました】 所要時間: %.2f秒",tc.end()));\r
                                return null;\r
@@ -3141,120 +3112,138 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener,H
                \r
                return true;\r
        }\r
+\r
+       /**\r
+        * \r
+        * @see #doLoadTVProgram(boolean, LoadFor)\r
+        */\r
+       private void doRedrawTVProgram() {\r
+               \r
+               // 新聞描画枠のリセット\r
+               paper.clearPanel();\r
+               paper.buildMainViewByDate();\r
+               \r
+               // サイドツリーの再構築\r
+               paper.redrawTreeByDate();\r
+               paper.redrawTreeByPassed();\r
+               \r
+               listed.redrawTreeByHistory();\r
+               listed.redrawTreeByCenter();\r
+               \r
+               // 再描画\r
+               paper.reselectTree();\r
+               listed.reselectTree();\r
+       }\r
+       \r
+       /***************************************\r
+        * 自クラス内呼び出しによる\r
+        **************************************/\r
        \r
        /**\r
         * Web番組表をDLする\r
-        * <P>単体実行の場合はこちらを呼び出す:{@link #reLoadTVProgram(LoadFor)}\r
+        * <P>単体実行の場合はこちらを呼び出す:{@link #doLoadTVProgram(LoadFor)}\r
         * <P>部品実行の場合はこちらを呼び出す\r
         */\r
-       private void loadTVProgram(final boolean b, final LoadFor lf) {\r
+       private boolean loadTVProgram(final boolean force, final LoadFor lf) {\r
                \r
                final String FUNCID = "[Web番組表取得] ";\r
                final String ERRID = "[ERROR]"+FUNCID;\r
-               //\r
-               new SwingBackgroundWorker(true) {\r
+               \r
+               try {\r
+                       String msg;\r
+                       TVProgram tvp;\r
                        \r
-                       @Override\r
-                       protected Object doWorks() throws Exception {\r
-                               try {\r
-                                       String msg;\r
-                                       TVProgram tvp;\r
-                                       \r
-                                       tvp = tvprograms.getTvProgPlugin(null);\r
-                                       if ( tvp != null )\r
-                                       {\r
-                                               String sType = "地上波&BS番組表";\r
-                                               if (lf == LoadFor.ALL || lf == LoadFor.TERRA) {\r
-                                                       loadTVProgramOnce(tvp, sType, tvp.getSelectedArea(), false, b);\r
-                                               }\r
-                                               else {\r
-                                                       stwin.appendMessage(FUNCID+sType+"へのアクセスはスキップされました: "+tvp.getTVProgramId());\r
-                                               }\r
-                                       }\r
-                                       \r
-                                       tvp = tvprograms.getCsProgPlugin(null);\r
-                                       if ( tvp != null )\r
-                                       {\r
-                                               String sType = "CS番組表[プライマリ]";\r
-                                               if (lf == LoadFor.ALL || lf == LoadFor.CS || lf == LoadFor.CSo1) {\r
-                                                       loadTVProgramOnce(tvp, sType, tvp.getSelectedArea(), false, b);\r
-                                               }\r
-                                               else {\r
-                                                       stwin.appendMessage(FUNCID+sType+"へのアクセスはスキップされました: "+tvp.getTVProgramId());\r
-                                               }\r
-                                       }\r
-                                       \r
-                                       tvp = tvprograms.getCs2ProgPlugin(null);\r
-                                       if ( tvp != null )\r
-                                       {\r
-                                               String sType = "CS番組表[セカンダリ]";\r
-                                               if (lf == LoadFor.ALL || lf == LoadFor.CS || lf == LoadFor.CSo2) {\r
-                                                       loadTVProgramOnce(tvp, sType, tvp.getSelectedArea(), false, b);\r
-                                               }\r
-                                               else {\r
-                                                       stwin.appendMessage(FUNCID+sType+"へのアクセスはスキップされました: "+tvp.getTVProgramId());\r
-                                               }\r
-                                       }\r
-                                       \r
-                                       tvp = tvprograms.getSyobo();\r
-                                       if ( tvp != null ) {\r
-                                               String sType = "しょぼかる";\r
-                                               if ( (lf == LoadFor.ALL || lf == LoadFor.SYOBO) && enableWebAccess && env.getUseSyobocal()) {\r
-                                                       tvp.loadCenter(tvp.getSelectedCode(), b);       // しょぼかるには放送局リストを取得するイベントが他にないので\r
-                                                       loadTVProgramOnce(tvp, sType, null, true, b);\r
-                                               }\r
-                                               else {\r
-                                                       stwin.appendMessage(FUNCID+sType+"へのアクセスはスキップされました.");\r
-                                               }\r
-                                               \r
-                                               // しょぼかるの新番組マークを引き継ぐ\r
-                                               attachSyoboNew();\r
-                                       }\r
-                               \r
-                                       PickedProgram pickup = tvprograms.getPickup();\r
-                                       if ( tvp != null ) {\r
-                                               pickup.refresh();\r
-                                               //pickup.save();\r
-                                       }\r
-                                       \r
-                                       // 番組タイトルを整形する\r
-                                       fixTitle();\r
-                                       fixDetail();\r
-                                       \r
-                                       // 検索結果の再構築\r
-                                       stwin.appendMessage(FUNCID+"検索結果を生成します.");\r
-                                       mpList.clear(env.getDisableFazzySearch(), env.getDisableFazzySearchReverse());\r
-                                       mpList.build(tvprograms, trKeys.getTraceKeys(), srKeys.getSearchKeys());\r
-                                       \r
-                                       // 過去ローグ\r
-                                       if ( env.getUsePassedProgram() ) {\r
-                                               TatCount tc = new TatCount();\r
-                                               stwin.appendMessage(FUNCID+"過去ログを生成します.");\r
-                                               if ( tvprograms.getPassed().save(tvprograms.getIterator(), chsort.getClst(), env.getPrepPassedProgramCount()) ) {\r
-                                                       msg = String.format(FUNCID+"過去ログを生成しました [%.2f秒].",tc.end());\r
-                                                       StdAppendMessage(msg);\r
-                                               }\r
-                                               //PassedProgramList.getDateList(env.getPassedLogLimit());\r
-                                       }\r
-                                       else {\r
-                                               stwin.appendMessage(FUNCID+"過去ログは記録されません.");\r
-                                       }\r
+                       tvp = tvprograms.getTvProgPlugin(null);\r
+                       if ( tvp != null )\r
+                       {\r
+                               String sType = "地上波&BS番組表";\r
+                               if (lf == LoadFor.ALL || lf == LoadFor.TERRA) {\r
+                                       loadTVProgramOnce(tvp, sType, tvp.getSelectedArea(), false, force);\r
                                }\r
-                               catch (Exception e) {\r
-                                       e.printStackTrace();\r
-                                       mwin.appendError(ERRID+"番組情報の取得で例外が発生");\r
-                                       ringBeep();\r
-                                       return null;\r
+                               else {\r
+                                       stwin.appendMessage(FUNCID+sType+"へのアクセスはスキップされました: "+tvp.getTVProgramId());\r
                                }\r
-                               return null;\r
                        }\r
                        \r
-                       @Override\r
-                       protected void doFinally() {\r
+                       tvp = tvprograms.getCsProgPlugin(null);\r
+                       if ( tvp != null )\r
+                       {\r
+                               String sType = "CS番組表[プライマリ]";\r
+                               if (lf == LoadFor.ALL || lf == LoadFor.CS || lf == LoadFor.CSo1 || lf == LoadFor.CSwSD) {\r
+                                       loadTVProgramOnce(tvp, sType, tvp.getSelectedArea(), false, force);\r
+                               }\r
+                               else {\r
+                                       stwin.appendMessage(FUNCID+sType+"へのアクセスはスキップされました: "+tvp.getTVProgramId());\r
+                               }\r
                        }\r
-               }.execute();\r
+                       \r
+                       tvp = tvprograms.getCs2ProgPlugin(null);\r
+                       if ( tvp != null )\r
+                       {\r
+                               String sType = "CS番組表[セカンダリ]";\r
+                               if (lf == LoadFor.ALL || lf == LoadFor.CS || lf == LoadFor.CSo2 || lf == LoadFor.CSwSD) {\r
+                                       loadTVProgramOnce(tvp, sType, tvp.getSelectedArea(), false, force);\r
+                               }\r
+                               else {\r
+                                       stwin.appendMessage(FUNCID+sType+"へのアクセスはスキップされました: "+tvp.getTVProgramId());\r
+                               }\r
+                       }\r
+                       \r
+                       tvp = tvprograms.getSyobo();\r
+                       if ( tvp != null ) {\r
+                               String sType = "しょぼかる";\r
+                               if ( (lf == LoadFor.ALL || lf == LoadFor.SYOBO) && enableWebAccess && env.getUseSyobocal()) {\r
+                                       tvp.loadCenter(tvp.getSelectedCode(), force);   // しょぼかるには放送局リストを取得するイベントが他にないので\r
+                                       loadTVProgramOnce(tvp, sType, null, true, force);\r
+                               }\r
+                               else {\r
+                                       stwin.appendMessage(FUNCID+sType+"へのアクセスはスキップされました.");\r
+                               }\r
+                               \r
+                               // しょぼかるの新番組マークを引き継ぐ\r
+                               attachSyoboNew();\r
+                       }\r
+               \r
+                       PickedProgram pickup = tvprograms.getPickup();\r
+                       if ( tvp != null ) {\r
+                               pickup.refresh();\r
+                               //pickup.save();\r
+                       }\r
+                       \r
+                       // 番組タイトルを整形する\r
+                       fixTitle();\r
+                       fixDetail();\r
+                       \r
+                       // 検索結果の再構築\r
+                       stwin.appendMessage(FUNCID+"検索結果を生成します.");\r
+                       mpList.clear(env.getDisableFazzySearch(), env.getDisableFazzySearchReverse());\r
+                       mpList.build(tvprograms, trKeys.getTraceKeys(), srKeys.getSearchKeys());\r
+                       \r
+                       // 過去ローグ\r
+                       if ( env.getUsePassedProgram() ) {\r
+                               TatCount tc = new TatCount();\r
+                               stwin.appendMessage(FUNCID+"過去ログを生成します.");\r
+                               if ( tvprograms.getPassed().save(tvprograms.getIterator(), chsort.getClst(), env.getPrepPassedProgramCount()) ) {\r
+                                       msg = String.format(FUNCID+"過去ログを生成しました [%.2f秒].",tc.end());\r
+                                       StdAppendMessage(msg);\r
+                               }\r
+                               //PassedProgramList.getDateList(env.getPassedLogLimit());\r
+                       }\r
+                       else {\r
+                               stwin.appendMessage(FUNCID+"過去ログは記録されません.");\r
+                       }\r
+               }\r
+               catch (Exception e) {\r
+                       e.printStackTrace();\r
+                       mwin.appendError(ERRID+"番組情報の取得で例外が発生");\r
+                       ringBeep();\r
+                       return false;\r
+               }\r
+               \r
+               return true;\r
        }\r
        \r
+       // 分割\r
        private void loadTVProgramOnce(TVProgram tvp, String sType, String aName, boolean loadonly, boolean force) {\r
                \r
                final String FUNCID = "[Web番組表取得] ";\r
@@ -3468,7 +3457,7 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener,H
                                                                // "コメンタリ"の記述のあるものは「副音声」扱いにする(副音声でなくても)\r
                                                                tvd.option.add(ProgOption.MULTIVOICE);\r
                                                        }\r
-                                                       if ( (tvd.title.contains("劇場版") || tvd.detail.contains("映画")) && ! tvd.isEqualsGenre(ProgGenre.MOVIE, ProgSubgenre.MOVIE_ANIME) ) {\r
+                                                       if ( (tvd.title.contains("劇場版") || (tvd.detail.contains("映画") && ! tvd.detail.contains("映画館"))) && ! tvd.isEqualsGenre(ProgGenre.MOVIE, ProgSubgenre.MOVIE_ANIME) ) {\r
                                                                // ジャンル=アニメだがタイトルに「劇場版」が含まれるならジャンル=映画(アニメ映画)を追加する\r
                                                                if ( tvd.genrelist == null ) {\r
                                                                        tvd.genrelist = new ArrayList<ProgGenre>();\r
@@ -3536,6 +3525,11 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener,H
                tvd.dontoverlapdown = (tvd.center.startsWith("NHK") || tvd.center.startsWith("NHK"));\r
        }\r
        \r
+       \r
+       /*******************************************************************************\r
+        * 過去ログ検索\r
+        ******************************************************************************/\r
+       \r
        /**\r
         * <P>過去ログから検索キーワードにマッチする情報を取得する\r
         * <P>全部検索がヒットした結果がかえるのだから {@link ProgDetailList} ではなく {@link MarkedProgramList} を使うべきなのだが…\r
@@ -3617,6 +3611,154 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener,H
                return true;\r
        }\r
 \r
+       \r
+       /*******************************************************************************\r
+        * スナップ・ショット!\r
+        ******************************************************************************/\r
+       \r
+       /**\r
+        * 番組表のスナップショットをファイルに保存したり印刷したりする\r
+        */\r
+       private boolean getSnapshot(int currentpage, int numberofpages) {\r
+               \r
+               try {\r
+                       String fname;\r
+                       if ( mainWindow.isTabSelected(MWinTab.LISTED) ) {\r
+                               // リスト形式\r
+                               fname = String.format("snapshot.%s",env.getSnapshotFmt().getExtension());\r
+                               CommonSwingUtils.saveComponentAsJPEG(listed.getCurrentView(), listed.getTableHeader(), null, listed.getTableBody(), fname, env.getSnapshotFmt(), Viewer.this);\r
+                       }\r
+                       else if ( mainWindow.isTabSelected(MWinTab.PAPER) ){\r
+                               // 新聞形式\r
+                               if ( env.getDrawcacheEnable() || ! env.isPagerEnabled() ) {\r
+                                       fname = String.format("snapshot.%s",env.getSnapshotFmt().getExtension());\r
+                               }\r
+                               else {\r
+                                       if ( env.getAllPageSnapshot() ) {\r
+                                               for ( int i=0; i<numberofpages; i++ ) {\r
+                                                       if ( i != currentpage ) {\r
+                                                               // カレントページは最後にスナップる(再描画を1回で済ませるため)\r
+                                                               toolBar.setSelectedPagerIndex(i);\r
+                                                               fname = String.format("snapshot%02d.%s",i+1,env.getSnapshotFmt().getExtension());\r
+                                                               CommonSwingUtils.saveComponentAsJPEG(paper.getCurrentView(), paper.getCenterPane(), paper.getTimebarPane(), paper.getCurrentPane(), fname, env.getSnapshotFmt(), Viewer.this);\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                                       fname = String.format("snapshot%02d.%s",currentpage+1,env.getSnapshotFmt().getExtension());\r
+                                       toolBar.setSelectedPagerIndex(currentpage);\r
+                               }\r
+                               CommonSwingUtils.saveComponentAsJPEG(paper.getCurrentView(), paper.getCenterPane(), paper.getTimebarPane(), paper.getCurrentPane(), fname, env.getSnapshotFmt(), Viewer.this);\r
+                       }\r
+                       else {\r
+                               // 他のタブ\r
+                               return true;\r
+                       }\r
+                       \r
+                       Desktop desktop = Desktop.getDesktop();\r
+                       if (env.getPrintSnapshot()) {\r
+                               // 印刷\r
+                               desktop.print(new File(fname));\r
+                       }\r
+                       else {\r
+                               // ファイルに保存\r
+                               String emsg = CommonUtils.openFile(fname);\r
+                               if (emsg != null) {\r
+                                       mwin.appendError(emsg);\r
+                                       return false;\r
+                               }\r
+                       }\r
+                       \r
+                       return true;\r
+                       \r
+               } catch (IOException e) {\r
+                       e.printStackTrace();\r
+               }\r
+               \r
+               return false;\r
+       }\r
+       \r
+       \r
+       /*******************************************************************************\r
+        * ここからおおむね初期化処理にかかわるメソッド群\r
+        ******************************************************************************/\r
+\r
+       /**\r
+        * 各種設定の変更の反映\r
+        */\r
+       private boolean setEnv(final boolean reload_prog) {\r
+               \r
+               bounds.save();\r
+               cbitems.save();\r
+               env.save();\r
+\r
+               // CommonUtilsの設定変更\r
+               CommonUtils.setAdjLateNight(env.getAdjLateNight());\r
+               CommonUtils.setExpandTo8(env.getExpandTo8());\r
+               CommonUtils.setUseRundll32(env.getUseRundll32());\r
+               CommonUtils.setDisplayPassedReserve(env.getDisplayPassedReserve());\r
+               CommonUtils.setDebug(env.getDebug());\r
+               \r
+               SwingBackgroundWorker.setDebug(env.getDebug());\r
+\r
+               // ほにゃらら\r
+               toolBar.setDebug(env.getDebug());\r
+               autores.setDebug(env.getDebug());\r
+\r
+               // PassedProgramListの設定変更\r
+               tvprograms.getPassed().setPassedDir(env.getPassedDir());\r
+\r
+               // レコーダプラグインの設定変更\r
+               for ( HDDRecorder rec : recorders ) {\r
+                       // 拡張設定だけ\r
+                       setSettingRecPluginExt(rec, env);\r
+               }\r
+\r
+               // Web番組表共通設定\r
+               setSettingProgPluginCommon(env);\r
+               \r
+               // web番組表のリフレッシュ\r
+               setSettingProgPluginAll(env);\r
+               \r
+               // リロードメニューの書き換え\r
+               toolBar.updateReloadReservedExtension();\r
+               toolBar.updateReloadProgramExtension();\r
+               \r
+               // ページャーコンボボックスの書き換え\r
+               toolBar.setPagerItems();\r
+               \r
+               // 列の表示・非表示\r
+               listed.setMarkColumnVisible(env.getSplitMarkAndTitle());\r
+               listed.setDetailColumnVisible(env.getShowDetailOnList());\r
+               listed.setRowHeaderVisible(env.getRowHeaderVisible());\r
+               reserved.setRowHeaderVisible(env.getRowHeaderVisible());\r
+               \r
+               // 強調色\r
+               listed.setMatchedKeywordColor(env.getMatchedKeywordColor());\r
+               listed.setRsvdLineColor((env.getRsvdLineEnhance())?(env.getRsvdLineColor()):(null));\r
+               listed.setPickedLineColor((env.getRsvdLineEnhance())?(env.getPickedLineColor()):(null));\r
+               listed.setCurrentLineColor((env.getCurrentLineEnhance())?(env.getCurrentLineColor()):(null));\r
+               \r
+               // システムトレイアイコン\r
+               setTrayIconVisible(env.getShowSysTray());\r
+               setXButtonAction(env.getShowSysTray() && env.getHideToTray());\r
+               \r
+               // 新聞形式のツールチップの表示時間を変更する\r
+               setTooltipDelay();\r
+               \r
+               // 番組情報の再取得\r
+               if ( reload_prog ) {\r
+                       loadTVProgram(false, LoadFor.ALL);      // 部品呼び出し\r
+               }\r
+               \r
+               // Web番組表の再構築\r
+               mpList.setHistoryOnlyUpdateOnce(env.getHistoryOnlyUpdateOnce());\r
+               mpList.setShowOnlyNonrepeated(env.getShowOnlyNonrepeated());\r
+               \r
+               doRedrawTVProgram();    // か き な お し\r
+\r
+               return true;\r
+       }\r
+       \r
        // システムトレイ関係\r
        private void getTrayIcon() {\r
                if ( trayicon != null ) {\r
index 28e9d38..3c76d38 100644 (file)
@@ -1,45 +1,50 @@
 ---バグとおぼしき現象\r
 \r
 【過去ログ】検索ボックスでの日付指定と表示される日付があわない\r
-【予約ダイアログ】類似予約対応で、類似予約なしを選択しても番組IDがリセットされない\r
-【予約ダイアログ】類似予約対応で、類似予約なしを選択してもタイトルがリセットされない\r
 \r
 【レコーダ対応】RD-X5プラグインのバグ調査依頼への対応\r
 \r
 【新聞形式】類似予約を正しく抽出できない問題→予約がタイトルのみで、番組情報はタイトル+サブタイトルの場合スコアが足りなくなる →番組情報の保持の仕方を変えたので表示部をいじれば直るだろう\r
 【リスト形式】放送局別表示で、予約が多いと描画が重くなる件(AT-Xで大量に自動録画が入っているとか) →番組情報に予約情報へのリンクを張らないと改善しないだろう\r
-【リスト形式】予約中でもピックアップ中であることが分かるようにする ※「★◎」みたいな表示がよいか?\r
-\r
-【録画結果一覧】TvRockに上限設定が反映されていない?\r
 \r
 【新聞形式】snapshotで落ちる →バグじゃないかも?\r
 \r
-【番組追跡】リピート放送検出の改善>番組追跡履歴の保存  →帯での再放送だと、リピート放送検出がうまくないので\r
-\r
 【キーワード検索】ダイアログがなんかおかしい(条件の二重登録?) →登録ラベルの重複チェックが行えていない既存バグのせいだった\r
 \r
+【リスト形式】検索結果生成後にノードの赤黒を更新していない?\r
+\r
+【予約ダイアログ】EPG予約選択時のマージン警告がうまく動かない場合があるみたい\r
+\r
 ---優先度高\r
 \r
-【自動予約登録】EDCBとTVRockの自動予約登録編集機能の追加(~6月中旬厳守) やばい!やばい!やばい!\r
+【自動予約登録】EDCBとTVRockの自動予約登録編集機能の追加(~6月中旬厳守) →やばい!やばい!やばい! →時間切れにつき次回リリースは番組改変がおちついてからにする\r
+【CHコンバート設定】さっさと編集を実装する →2012/11から放置だから…\r
+\r
 \r
-【予約ダイアログ】EPG予約の際にのりしろが0秒以下なら赤字で警告する\r
+\r
+【番組追跡】リピート放送検出の改善>番組追跡履歴の保存  →帯での再放送だと、リピート放送検出がうまくないので\r
+\r
+【リスト形式】予約中でもピックアップ中であることが分かるようにする ※「★◎」みたいな表示がよいか?\r
+【リスト形式】予約マークが単日予約なのか繰り返し予約なのか分かるようにする ※「◎[機種依存文字]」みたいな\r
 \r
 【リスト形式】「バッチ予約では類似予約を参照しないオプション」の追加\r
  \r
-【ツールバー】「タブ内イベントでツールバーの状態を取りに行き処理」の現行ロジックを「ツールバー内のイベントで各タブの処理リスナーをキック」するように根本的に直す\r
-【その他】ContentId.class系列を全面改訂(staticをやめる!!)\r
+【その他】ContentId.class系列を全面改訂(staticをやめる!!) ※これはアカンかった\r
 \r
 【過去ログ】日時ファイル単位での管理をやめる →放送局名の変更に対応できていないので\r
 \r
-【CHコンバート設定】さっさと編集を実装する →2012/11月から放置だから…\r
 【レコーダ対応(EDCB/TvRock)】番組IDの取得をレコーダから取得するように変更 →番組表がとれるので、そこから探し出すようにする\r
 【レコーダ対応(TVRock)】UTF-8→ShiftJISに変換できない文字が化けるので、他の文字で置換するようにする →ちるだとかなー\r
 \r
 【予約一覧】番組表にマッチする番組が存在しているかどうかわかるようにする(繰り返し予約で改変期に番組が終了したとかがわかるようにする)\r
 【予約一覧】録画結果一覧に正常録画済みの記録がある場合はその情報が簡単に参照できるようにする(無効化操作のときの目視確認作業を省力化)\r
 \r
+【Web番組表対応】自動再取得トリガーが、個々のキャッシュファイルごとになっているが、プラグイン単位になるように変えたい ※現行方式はたしか、歯抜けになった時再取得しやすいとかどうとかで決めたはずだが、もうontvはないしね\r
+\r
 ---優先度並\r
 \r
+【ツールバー】「タブ内イベントでツールバーの状態を取りに行き処理」の現行ロジックを「ツールバー内のイベントで各タブの処理リスナーをキック」するように根本的に直す ※作業量が多いので後回し\r
+\r
 【予約ダイアログ】EPG予約未対応のレコーダの場合は番組ID取得設定になっても取得にいかないようにする? →スカパープレミアムの例外処理が現実的?\r
 【予約ダイアログ】鯛ナビの番組表とレコーダの番組表で時間が合わない番組への追従対応\r
 \r
@@ -54,7 +59,7 @@
 \r
 【新聞形式】番組枠のbitmap描画の高速化 \r
  案1)テキスト描画をjniでnaitiveコードにする\r
- 案2)番組枠を1番組ずつjlabelで描画してるが、テキストはでかい1枚のbitmapにして、jlabelはmouselistenerを拾うための枠だけにする\r
+ 案2)番組枠を1番組ずつjlabelで描画してるが、テキストはでかい1枚のbitmapにして、jlabelはmouselistenerを拾うための枠だけにする →意味なさそう\r
 \r
 ---優先度低\r
 \r
@@ -64,6 +69,7 @@
 【予約ダイアログ】類似予約をグラフィカルに表示(横に縦棒何本かひくとか) \r
 【レコーダ対応】EDCBのプロファイルに対応\r
 【レコーダ対応】DimoraからはDIGAの自動検索キーワードの編集ができるのでなんとかしたい\r
+【レコーダ対応】TvRockで直に予約したEPG予約を取得する際、TvRock番組表も参照して番組IDを取得する\r
 \r
 【レコーダ対応】時間のかかる処理のキャンセル操作\r
 \r
 【その他】HDDRecorderListで自己フィールド生成を回避するためにmylistをstaticで宣言とかトチ狂ったコードを書いていたので修正\r
 【新聞形式】過去予約非表示にしても、過去ピックアップ情報が表示される問題の修正\r
 \r
+【予約ダイアログ】EPG予約の際にのりしろが0秒以下なら赤字で警告する\r
+【録画結果一覧】TvRockに上限設定が反映されていない? →EDCBは毎回全部取得し直しだったので取得データのみチェックすればよかったが、TvRockは差分取得だったので既存データに対してもチェックをする必要があった\r
+【番組表取得/予約一覧取得】SwingWorkerが入れ子になっていたので一段減らすように修正\r
+【予約ダイアログ】類似予約対応で、類似予約なしを選択しても番組IDがリセットされない →直したはず\r
+【予約ダイアログ】類似予約対応で、類似予約なしを選択してもタイトルがリセットされない →直したはず\r
+\r
 ---以上\r