OSDN Git Service

[予約ダイアログ]自動予約編集への対応に伴うレイアウト変更(3)
authorpeeweedee <peeweedee@users.sourceforge.jp>
Wed, 3 Jul 2013 03:18:56 +0000 (12:18 +0900)
committerpeeweedee <peeweedee@users.sourceforge.jp>
Wed, 3 Jul 2013 03:18:56 +0000 (12:18 +0900)
25 files changed:
TinyBannavi/05_history.txt
TinyBannavi/src/tainavi/AVSetting.java
TinyBannavi/src/tainavi/AbsListedView.java
TinyBannavi/src/tainavi/AbsPaperView.java
TinyBannavi/src/tainavi/AbsReserveDialog.java
TinyBannavi/src/tainavi/AbsReserveListView.java
TinyBannavi/src/tainavi/CommonUtils.java
TinyBannavi/src/tainavi/HDDRecorder.java
TinyBannavi/src/tainavi/HDDRecorderList.java
TinyBannavi/src/tainavi/HDDRecorderUtils.java
TinyBannavi/src/tainavi/JCheckBoxPanel.java
TinyBannavi/src/tainavi/JComboBoxPanel.java
TinyBannavi/src/tainavi/JWideComboBox.java
TinyBannavi/src/tainavi/LikeReserveEditorPanel.java [new file with mode: 0644]
TinyBannavi/src/tainavi/LikeReserveList.java
TinyBannavi/src/tainavi/LikeReserveSelectable.java [new file with mode: 0644]
TinyBannavi/src/tainavi/PlugIn_RecDIGA_DMR_BWT2100.java
TinyBannavi/src/tainavi/PlugIn_RecRD_EDCB.java
TinyBannavi/src/tainavi/PlugIn_RecRD_TvRock.java
TinyBannavi/src/tainavi/RecSettingEditorPanel.java [new file with mode: 0644]
TinyBannavi/src/tainavi/RecSettingSelectable.java [new file with mode: 0644]
TinyBannavi/src/tainavi/RecordExecutable.java [new file with mode: 0644]
TinyBannavi/src/tainavi/TitleEditorPanel.java [new file with mode: 0644]
TinyBannavi/src/tainavi/Viewer.java
TinyBannavi/src/todo.txt

index 0fcd019..6102fff 100644 (file)
  ・(その他) SwingWorkerで生成したサブスレッド内で想定外のruntime exceptionが発生するとサブスレッドがログも出さずに死んでしまってエラー原因を調査できなかったが、ログが出るように仕掛けをしたのでその仕掛けがうまく動くようなら今後改善が進んでいくはず\r
  ・(予約ダイアログ) 類似予約テーブルで「類似予約を選択しない」を選んでも、番組ID取得ボタンがリセットされない場合がある問題を修正\r
  ・(予約ダイアログ他) ウィンドウサイズの設定において、ウィンドウ枠についてtop部分の高さしか考慮してないところがあったのでbottom,left,rigth分も加味するように修正\r
+ ・(レコーダ対応[TvRock]) 予約一覧取得時、「終了後コマンド」の「規定コマンドを実行」が正しく取得できていなかった問題を修正\r
+ ・(その他) ラベル付きチェックボックスで、ラベルをクリックしてチェック状態を変更してもActionListenerがトリガーされていなかった問題を修正\r
+ ・(新聞形式) 深夜帯(24-29時)の右クリックメニューオープン時の類似/隣接予約の抽出がうまくいってなかったようなそうでもなかったようなところを修正\r
+ ・(新聞形式) 改変期などで同一時間帯の番組名が変わった時、旧番組用の予約が右クリックメニューオープン時の類似予約にも近接予約にもひっからず表示されてなかったぽいようなそうでもないようなところを修正 ※ON/OFF、削除できるだけ\r
 \r
 3.22.1β+1.5.12(2013-05-23)\r
 ■変更点\r
index e12d6ff..10a1fe2 100644 (file)
@@ -3,6 +3,8 @@ package tainavi;
 import java.io.File;\r
 import java.util.ArrayList;\r
 \r
+import tainavi.TVProgram.ProgGenre;\r
+\r
 public class AVSetting {\r
        \r
        //\r
@@ -40,7 +42,28 @@ public class AVSetting {
        avs = tmp;\r
        }\r
        \r
-       public AVs get(String key_recorderId, String key_genre) {\r
+       /**\r
+        * キーに紐づいた録画設定を取得する\r
+        */\r
+       public AVs getSelectedAVs(String selected_key, String recId) {\r
+               \r
+               AVs myavs = get(recId, selected_key);\r
+               if ( myavs != null ) {\r
+                       // キーに紐づいた設定がみつかた\r
+                       return myavs;\r
+               }\r
+               \r
+               myavs = get(recId, null);\r
+               if ( myavs != null ) {\r
+                       // デフォルトの設定がみつかた\r
+                       return myavs;\r
+               }\r
+       \r
+               // みつかんねーよ\r
+               return null;\r
+       }\r
+       \r
+       private AVs get(String key_recorderId, String key_genre) {\r
                for ( AVs a : avs ) {\r
                        if ( a.getRecorderId().equals(key_recorderId) ) {\r
                                if ( (a.getGenre() != null && a.getGenre().equals(key_genre)) ||\r
index b3830d3..ef91bb9 100644 (file)
@@ -128,8 +128,7 @@ public abstract class AbsListedView extends JPanel implements TickTimerListener
        protected abstract void showPopupForTraceProgram(\r
                        final JComponent comp,\r
                        final ProgDetailList tvd, final String keyword, final int threshold,\r
-                       final int x, final int y, final int h\r
-                       );\r
+                       final int x, final int y);\r
 \r
        /**\r
         * 予約マーク・予約枠を更新してほしい\r
@@ -1570,7 +1569,7 @@ public abstract class AbsListedView extends JPanel implements TickTimerListener
                                        \r
                                        int threshold = getThrValByRow(row);\r
                                        String keyword = (threshold > 0) ? (getKeyValByRow(row)) : (tvd.title);\r
-                                       showPopupForTraceProgram(t, tvd, keyword, threshold, p.x, p.y, -1);\r
+                                       showPopupForTraceProgram(t, tvd, keyword, threshold, p.x, p.y);\r
                                }\r
                        }\r
                        else if (e.getButton() == MouseEvent.BUTTON1) {\r
@@ -1612,7 +1611,7 @@ public abstract class AbsListedView extends JPanel implements TickTimerListener
                                                }\r
                                                \r
                                                // 予約マークを更新する\r
-                                               if (rD.isReserved()) {\r
+                                               if (rD.isSucceededReserve()) {\r
                                                        // 自分\r
                                                        setReservedMarks();\r
                                                        tableModel_listed.fireTableDataChanged();\r
@@ -2244,7 +2243,7 @@ public abstract class AbsListedView extends JPanel implements TickTimerListener
                        \r
                        // 予約ダイアログは見せないまま更新を実行する\r
                        \r
-                       if ( ! rD.isReserved()) {\r
+                       if ( ! rD.isSucceededReserve()) {\r
                                StdAppendError("【警告】予約の登録に失敗しました: "+rowData.get(row).tvd.title);\r
                                break;\r
                        }\r
index d25c0d2..4eab6d3 100644 (file)
@@ -100,7 +100,7 @@ public abstract class AbsPaperView extends JPanel implements TickTimerListener,H
        protected abstract void showPopupForTraceProgram(\r
                        final JComponent comp,\r
                        final ProgDetailList tvd, final String keyword, final int threshold,\r
-                       final int x, final int y, final int h\r
+                       final int x, final int y, final String clickedDateTime\r
                        );\r
 \r
        /**\r
@@ -1679,6 +1679,23 @@ public abstract class AbsPaperView extends JPanel implements TickTimerListener,H
                return -1;\r
        }\r
        \r
+       /**\r
+        * 番組枠のクリック位置を日時に変換する\r
+        */\r
+       private String getClickedDateTime(ProgDetailList tvd, int clikedY) {\r
+               \r
+               String clickedDateTime = null;\r
+               \r
+               if ( clikedY >= 0 && tvd.start.length() != 0 ) {\r
+                       // 新聞形式ならクリック位置の日時を算出する\r
+                       GregorianCalendar cala = CommonUtils.getCalendar(tvd.startDateTime);\r
+                       cala.add(Calendar.MINUTE, Math.round(((float)clikedY)/(bounds.getPaperHeightMultiplier()*paperHeightZoom)));\r
+                       clickedDateTime = CommonUtils.getDateTime(cala);\r
+               }\r
+               \r
+               return clickedDateTime;\r
+       }\r
+       \r
        \r
        /*******************************************************************************\r
         * ハンドラ―メソッド\r
@@ -1812,7 +1829,8 @@ public abstract class AbsPaperView extends JPanel implements TickTimerListener,H
                        if (e.getButton() == MouseEvent.BUTTON3) {\r
                                if (e.getClickCount() == 1) {\r
                                        // 右シングルクリックでメニューの表示\r
-                                       showPopupForTraceProgram(b, tvd, tvd.title, TraceKey.noFazzyThreshold, p.x, p.y, e.getY());\r
+                                       String clicked = getClickedDateTime(tvd, e.getY());\r
+                                       showPopupForTraceProgram(b, tvd, tvd.title, TraceKey.noFazzyThreshold, p.x, p.y, clicked);\r
                                }\r
                        }\r
                        else if (e.getButton() == MouseEvent.BUTTON1) {\r
@@ -1863,7 +1881,7 @@ public abstract class AbsPaperView extends JPanel implements TickTimerListener,H
                                rD.dispose();\r
                        }\r
                        \r
-                       if (rD.isReserved()) {\r
+                       if (rD.isSucceededReserve()) {\r
                                updateReserveDisplay();\r
                                updateReserveBorder(tvd.center);\r
                        }\r
index cea36d6..fd1b16f 100644 (file)
@@ -1,46 +1,22 @@
 package tainavi;\r
 \r
 import java.awt.BorderLayout;\r
-import java.awt.Color;\r
 import java.awt.Component;\r
 import java.awt.Dimension;\r
-import java.awt.Font;\r
-import java.awt.Rectangle;\r
-import java.awt.event.ActionEvent;\r
-import java.awt.event.ActionListener;\r
 import java.awt.event.ItemEvent;\r
 import java.awt.event.ItemListener;\r
-import java.awt.event.MouseAdapter;\r
-import java.awt.event.MouseEvent;\r
-import java.awt.event.MouseListener;\r
 import java.awt.event.WindowAdapter;\r
 import java.awt.event.WindowEvent;\r
 import java.awt.event.WindowListener;\r
 import java.util.ArrayList;\r
 import java.util.Calendar;\r
 import java.util.GregorianCalendar;\r
-import java.util.HashMap;\r
-import java.util.regex.Matcher;\r
-import java.util.regex.Pattern;\r
 \r
-import javax.swing.JButton;\r
-import javax.swing.JComboBox;\r
 import javax.swing.JDialog;\r
-import javax.swing.JLabel;\r
 import javax.swing.JPanel;\r
 import javax.swing.JScrollPane;\r
-import javax.swing.JTable;\r
-import javax.swing.JTextArea;\r
-import javax.swing.JTextField;\r
-import javax.swing.JViewport;\r
-import javax.swing.SpringLayout;\r
-import javax.swing.SwingUtilities;\r
-import javax.swing.border.LineBorder;\r
-import javax.swing.table.DefaultTableCellRenderer;\r
-import javax.swing.table.DefaultTableColumnModel;\r
-import javax.swing.table.DefaultTableModel;\r
-import javax.swing.table.TableColumn;\r
 \r
+import tainavi.TitleEditorPanel.TimeVal;\r
 import tainavi.HDDRecorder.RecType;\r
 import tainavi.TVProgram.ProgGenre;\r
 import tainavi.TVProgram.ProgOption;\r
@@ -50,8 +26,9 @@ import tainavi.TVProgram.ProgSubgenre;
 /**\r
  * 予約ダイアログのクラス\r
  * @since 3.15.4β ReserveDialogからクラス名変更\r
+ * @version 3.22.2β コンポーネントを、番組情報部・録画設定部、類似予約部の3つに分離(このまま突き進めばロジックとSwingコンポーネントを分離できるんじゃないかしら?)\r
  */\r
-abstract class AbsReserveDialog extends JDialog implements HDDRecorderListener {\r
+abstract class AbsReserveDialog extends JDialog implements HDDRecorderListener,RecordExecutable,RecSettingSelectable,LikeReserveSelectable {\r
 \r
        private static final long serialVersionUID = 1L;\r
 \r
@@ -60,6 +37,7 @@ abstract class AbsReserveDialog extends JDialog implements HDDRecorderListener {
        public void setDebug(boolean b) { debug = b; }\r
        private static boolean debug = false;\r
        \r
+       \r
        /*******************************************************************************\r
         * 抽象メソッド\r
         ******************************************************************************/\r
@@ -81,6 +59,7 @@ abstract class AbsReserveDialog extends JDialog implements HDDRecorderListener {
        // クラス内のイベントから呼び出されるもの\r
        protected abstract LikeReserveList findLikeReserves(ProgDetailList tvd, String keyword, int threshold);\r
        \r
+       \r
        /*******************************************************************************\r
         * 呼び出し元から引き継いだもの\r
         ******************************************************************************/\r
@@ -105,84 +84,6 @@ abstract class AbsReserveDialog extends JDialog implements HDDRecorderListener {
        \r
        private enum ChangedSelector { ALL, RECORDER, GENRE, LIKELIST };\r
        \r
-       private static final String ITEM_YES = "する";\r
-       private static final String ITEM_NO = "しない";\r
-       \r
-       private static final String ITEM_EVIDNEEDED = "番組ID取得";\r
-       \r
-       private static final int LIKERSVTABLE_NOTSELECTED = -1;\r
-       \r
-       private static final String LIKERSVID_NONE                      = "(類似予約なし)";\r
-       private static final String LIKERSVID_NOTSELECTED       = "類似予約を選択しない";\r
-       \r
-       // レイアウト関連\r
-       \r
-       private static final int PARTS_HEIGHT = 25;\r
-       private static final int SEP_WIDTH = 10;\r
-       private static final int SEP_WIDTH_NARROW = 5;\r
-       private static final int SEP_HEIGHT = 10;\r
-       private static final int SEP_HEIGHT_NALLOW = 5;\r
-       \r
-       private static final int COMBO_WIDTH = 115;\r
-       private static final int COMBO_WIDTH_WIDE = 155;\r
-       private static final int COMBO_HEIGHT = 43;\r
-\r
-       private static final int TITLE_WIDTH = COMBO_WIDTH_WIDE+COMBO_WIDTH*2+SEP_WIDTH*2;\r
-       private static final int CHNAME_WIDTH = COMBO_WIDTH*2+SEP_WIDTH;\r
-       private static final int DETAIL_WIDTH = TITLE_WIDTH+CHNAME_WIDTH+SEP_WIDTH;\r
-       private static final int DETAIL_HEIGHT = 100;\r
-       private static final int DATE_WIDTH = 175;\r
-       private static final int LIKELIST_WIDTH = 730;\r
-       private static final int LIKELIST_ROWS = 5;\r
-       \r
-       private static final int LABEL_WIDTH = 150;\r
-       private static final int BUTTON_WIDTH = 75;\r
-\r
-       private static final int RECORDER_WIDTH = COMBO_WIDTH_WIDE*2+SEP_WIDTH_NARROW;\r
-       private static final int ENCODER_WIDTH = COMBO_WIDTH*2+SEP_WIDTH_NARROW;\r
-       \r
-       private static final int LRT_HEADER_WIDTH = 20;\r
-       private static final int LRT_TITLE_WIDTH = 325;\r
-       private static final int LRT_START_WIDTH = 120;\r
-       private static final int LRT_RECORDER_WIDTH = 200;\r
-       private static final int LRT_ENCODER_WIDTH = 80;\r
-       \r
-       public static enum LikeRsvColumn {\r
-               TITLE           ("予約名",   LRT_TITLE_WIDTH),\r
-               START           ("開始日時",        LRT_START_WIDTH),\r
-               RECORDER        ("レコーダ",        LRT_RECORDER_WIDTH),\r
-               TUNER           ("エンコーダ",  LRT_ENCODER_WIDTH),\r
-               ;\r
-\r
-               private String name;\r
-               private int iniWidth;\r
-\r
-               private LikeRsvColumn(String name, int iniWidth) {\r
-                       this.name = name;\r
-                       this.iniWidth = iniWidth;\r
-               }\r
-\r
-               public String getName() {\r
-                       return name;\r
-               }\r
-\r
-               public int getIniWidth() {\r
-                       return iniWidth;\r
-               }\r
-               \r
-               public int getColumn() {\r
-                       return ordinal();\r
-               }\r
-               \r
-               public boolean equals(String s) {\r
-                       return name.equals(s);\r
-               }\r
-       };\r
-       \r
-       //\r
-       \r
-       private static final String TEXT_SAVEDEFAULT = "<HTML>録画設定を開いた時の枠内のデフォルト値として<BR>現在の値を使用するようにします。<BR><FONT COLOR=#FF0000>※ジャンル別AV設定があればそちらが優先されます。</FONT></HTML>";\r
-       \r
        // ログ関連\r
        \r
        private static final String MSGID = "["+getViewName()+"] ";\r
@@ -198,82 +99,10 @@ abstract class AbsReserveDialog extends JDialog implements HDDRecorderListener {
        \r
        private JPanel jContentPane_rsv = null;\r
 \r
-       // 番組設定\r
-       \r
-       private JPanel jPane_title = null;\r
-       \r
-       private JLabel jLabel_title = null;\r
-       private JButton jButton_getEventId = null;\r
-       private JButton jButton_addDate = null;\r
-       private JComboBoxWithPopup jComboBox_title = null;\r
-       private JLabel jLabel_ch = null;\r
-       private JComboBox jComboBox_ch = null;\r
-       \r
-       private JComboBoxPanel jCBXPanel_recorder = null;\r
-       private JComboBoxPanel jCBXPanel_encoder = null;\r
-       private JLabel jLabel_encoderemptywarn = null;\r
-       \r
-       private JLabel jLabel_date = null;\r
-       private JComboBox jComboBox_date = null;\r
-       \r
-       private JButton jButton_aTime = null;\r
-       private JTextField jTextField_ahh = null;\r
-       private JLabel jLabel_asep = null;\r
-       private JTextField jTextField_amm = null;\r
-       private JButton jButton_amm_up = null;\r
-       private JButton jButton_amm_down = null;\r
-       \r
-       private JButton jButton_zTime = null;\r
-       private JTextField jTextField_zhh = null;\r
-       private JLabel jLabel_zsep = null;\r
-       private JTextField jTextField_zmm = null;\r
-       private JButton jButton_zmm_up = null;\r
-       private JButton jButton_zmm_down = null;\r
-       \r
-       private JLabel jLabel_detail = null;\r
-       private JScrollPane jScrollPane_detail = null;\r
-       private JTextAreaWithPopup jTextArea_detail = null;\r
-       \r
-       private JCheckBoxPanel jCheckBox_OverlapDown2 = null;\r
-       private JCheckBoxPanel jCheckBox_spoex_extend = null;\r
-       \r
-       private JCheckBoxPanel jCheckBox_Exec = null;\r
-       private JCheckBoxPanel jCheckBox_Autocomplete = null;\r
-\r
-       private JButton jButton_update = null;\r
-       private JButton jButton_record = null;\r
-       private JButton jButton_cancel = null;\r
-\r
-       // 録画設定\r
-       private JPanel jPane_recsetting = null;\r
-\r
-       private JComboBoxPanel jCBXPanel_genre = null;\r
-       private JComboBoxPanel jCBXPanel_subgenre = null;\r
-       private JComboBoxPanel jCBXPanel_videorate = null;\r
-       private JComboBoxPanel jCBXPanel_audiorate = null;\r
-       private JComboBoxPanel jCBXPanel_folder = null;\r
-       private JComboBoxPanel jCBXPanel_dvdcompat = null;\r
-       private JComboBoxPanel jCBXPanel_device = null;\r
-       private JComboBoxPanel jCBXPanel_aspect = null;\r
-       private JComboBoxPanel jCBXPanel_bvperf = null;\r
-       private JComboBoxPanel jCBXPanel_lvoice = null;\r
-       private JComboBoxPanel jCBXPanel_autodel = null;\r
-       private JComboBoxPanel jCBXPanel_pursues = null;\r
-       private JComboBoxPanel jCBXPanel_xChapter = null;\r
-       private JComboBoxPanel jCBXPanel_msChapter = null;\r
-       private JComboBoxPanel jCBXPanel_mvChapter = null;\r
-       \r
-       private JLabel jLabel_rectype = null;\r
-       private JButton jButton_load = null;\r
-       private JButton jButton_save = null;\r
-       private JButton jButton_savedefault = null;\r
-       \r
-       // 類似予約\r
-       \r
-       private JScrollPane jPane_likersv = null;\r
-       \r
-       private LikeRsvTable jtbl_likersv = null;\r
-       private LikeRsvRowHeader jrhdr_likersv = null;\r
+       private TitleEditorPanel jPane_title = null;                            // 番組設定\r
+       private RecSettingEditorPanel jPane_recsetting = null;  // 録画設定\r
+       private LikeReserveEditorPanel  jPane_likersv = null;           // 類似予約\r
+       \r
        \r
        /*\r
         * その他\r
@@ -285,43 +114,21 @@ abstract class AbsReserveDialog extends JDialog implements HDDRecorderListener {
        private class Vals {\r
                \r
                // 検索した類似予約を保持する\r
-               LikeReserveList likeRsvList = null;\r
-               LikeReserveItem selectedLikeRsv = null; \r
+               LikeReserveList hide_likersvlist = null;\r
                \r
                // 類似予約抽出条件(タイトル)\r
                String keyword = "";\r
+               \r
                // 類似予約抽出条件(あいまい度)\r
                int threshold = 0;\r
                \r
-               // オープン時の単日指定の値(状態リセット用)\r
-               String byDateIni = "";\r
-               // オープン時の週次予約の値(状態リセット用)\r
-               String byWeeklyIni = "";\r
-               // オープン時の時刻の値\r
-               String ahh = "";\r
-               String amm = "";\r
-               String zhh = "";\r
-               String zmm = "";\r
-               \r
-               // 延長警告分のばすかどうか\r
-               boolean isExtended = false;\r
-               // おしりを1分削るかどうか\r
-               boolean isClipped = false;\r
                // 実行のON/OFFのみの更新かどうか\r
                boolean isUpdateOnlyExec = false;\r
        \r
                // 予約する番組情報\r
+               HDDRecorder hide_recorder = null;\r
                ProgDetailList hide_tvd = null;\r
-               // 番組IDはUI上には表示されない隠し項目\r
-               String hide_content_id = null;\r
-               // 未編集の番組開始日時\r
-               String hide_startdatetime = null;\r
-               \r
-               // 開いたときの選択レコーダ\r
-               HDDRecorder hide_default_recorder = null;\r
-               \r
-               // 本体予約一覧から開かれたかどうか\r
-               boolean hide_atreservedlist = false;\r
+               AVs hide_avs = null;\r
                \r
        }\r
        \r
@@ -330,7 +137,7 @@ abstract class AbsReserveDialog extends JDialog implements HDDRecorderListener {
        /**\r
         * 予約操作が成功したかどうかを返す。\r
         */\r
-       public boolean isReserved() { return doneReserve; }\r
+       public boolean isSucceededReserve() { return doneReserve; }\r
 \r
        private boolean doneReserve = false;\r
 \r
@@ -343,250 +150,25 @@ abstract class AbsReserveDialog extends JDialog implements HDDRecorderListener {
                \r
                super();\r
                \r
-               this.setModal(true);\r
-               this.setContentPane(getJContentPane_rsv());\r
+               setModal(true);\r
+               setContentPane(getJContentPane_rsv());\r
                \r
                // タイトルバーの高さも考慮する必要がある\r
                Dimension d = getJContentPane_rsv().getPreferredSize();\r
-               this.pack();\r
-               this.setBounds(\r
+               pack();\r
+               setBounds(\r
                                x,\r
                                y,\r
                                d.width+(this.getInsets().left+this.getInsets().right),\r
                                d.height+(this.getInsets().top+this.getInsets().bottom));\r
-               this.setResizable(false);\r
-               //\r
-               this.setTitle("録画設定");\r
-               \r
-               this.addWindowListener(wl_opened);\r
-       }\r
-       \r
-       \r
-       /*******************************************************************************\r
-        * アクション\r
-        ******************************************************************************/\r
-\r
-       /**\r
-        * 新規登録\r
-        * @see #doUpdate()\r
-        */\r
-       public void doRecord() {\r
-               \r
-               if (debug) System.out.println(DBGID+"doRecord "+vals.toString());\r
-               \r
-               // 新規処理\r
-               final ReserveList r = new ReserveList();\r
-               //r.setNo(-1);                          // PostRdEntry()中で取得するのでここはダミー(旧)\r
-               r.setId(null);                          // PostRdEntry()中で取得するのでここはダミー(新)\r
-               r.setRec_pattern((String)jComboBox_date.getSelectedItem());\r
-               r.setRec_pattern_id(-1);        // PostRdEntry()中で取得するのでここはダミー\r
-               r.setRec_nextdate((String)jComboBox_date.getItemAt(0)); // PostRdEntry()中で取得するのでここはダミー(日付を入れるのはDIGA用)\r
-               r.setAhh(String.format("%02d", Integer.valueOf(getJTextField_ahh().getText())));\r
-               r.setAmm(String.format("%02d", Integer.valueOf(getJTextField_amm().getText())));\r
-               r.setZhh(String.format("%02d", Integer.valueOf(getJTextField_zhh().getText())));\r
-               r.setZmm(String.format("%02d", Integer.valueOf(getJTextField_zmm().getText())));\r
-               r.setRec_min("");                       // PostRdEntry()中で取得するのでここはダミー\r
-               r.setTuner((String)jCBXPanel_encoder.getSelectedItem());\r
-               r.setRec_mode((String)jCBXPanel_videorate.getSelectedItem());\r
-               r.setRec_audio((String)jCBXPanel_audiorate.getSelectedItem());\r
-               r.setRec_folder((String)jCBXPanel_folder.getSelectedItem());\r
-               r.setRec_genre((String)jCBXPanel_genre.getSelectedItem());\r
-               r.setRec_subgenre((String)jCBXPanel_subgenre.getSelectedItem());\r
-               r.setRec_dvdcompat((String)jCBXPanel_dvdcompat.getSelectedItem());\r
-               r.setRec_device((String)jCBXPanel_device.getSelectedItem());\r
-               // 自動チャプタ関連\r
-               r.setRec_xchapter((String)jCBXPanel_xChapter.getSelectedItem());\r
-               r.setRec_mschapter((String)jCBXPanel_msChapter.getSelectedItem());\r
-               r.setRec_mvchapter((String)jCBXPanel_mvChapter.getSelectedItem());\r
-               // その他\r
-               r.setRec_aspect((String)jCBXPanel_aspect.getSelectedItem());\r
-               r.setRec_bvperf((String)jCBXPanel_bvperf.getSelectedItem());\r
-               r.setRec_lvoice((String)jCBXPanel_lvoice.getSelectedItem());\r
-               r.setRec_autodel((String)jCBXPanel_autodel.getSelectedItem());\r
-               \r
-               //r.setPursues(jCheckBox_Pursues.isSelected());\r
-               r.setPursues(ITEM_YES.equals((String) jCBXPanel_pursues.getSelectedItem()));\r
-               \r
-               r.setTitle((String)jComboBox_title.getSelectedItem());\r
-               r.setTitlePop(TraceProgram.replacePop(r.getTitle()));\r
-               r.setDetail(jTextArea_detail.getText());\r
-               r.setChannel("");                       // PostRdEntry()中で取得するのでここはダミー\r
-               r.setCh_name((String)jComboBox_ch.getSelectedItem());\r
-               r.setStartDateTime("");         // PostRdEntry()中で取得するのでここはダミー\r
-               r.setEndDateTime("");           // PostRdEntry()中で取得するのでここはダミー\r
-               r.setExec(jCheckBox_Exec.isSelected());\r
-               r.setAutocomplete(jCheckBox_Autocomplete.isSelected());\r
-               \r
-               r.setContentId(vals.hide_content_id);\r
-               \r
-               // 予約実行\r
-               StWin.clear();\r
-               new SwingBackgroundWorker(false) {\r
-                       \r
-                       @Override\r
-                       protected Object doWorks() throws Exception {\r
-                               \r
-                               String myself = (String)jCBXPanel_recorder.getSelectedItem();\r
-                               for ( HDDRecorder recorder : recorders.findInstance(myself) ) {\r
-                                       \r
-                                       StWin.appendMessage(MSGID+"予約を登録します:"+r.getTitle());\r
-                                       \r
-                                       if ( recorder.PostRdEntry(r) ) {\r
-                                               \r
-                                               MWin.appendMessage(MSGID+"正常に登録できました:"+r.getTitle()+"("+r.getCh_name()+")");\r
-                                               doneReserve = true;\r
-                                               \r
-                                               // カレンダーに登録する\r
-                                               if ( recorder.getUseCalendar() && jCheckBox_Exec.isSelected() ) {\r
-                                                       \r
-                                                       for ( HDDRecorder calendar : recorders.findInstance(RecType.CALENDAR) ) {\r
-                                                               \r
-                                                               StWin.appendMessage(MSGID+"カレンダーに予約情報を登録します");\r
-                                                               \r
-                                                               if ( ! calendar.PostRdEntry(r)) {\r
-                                                                       MWin.appendError(ERRID+"[カレンダー] "+calendar.getErrmsg());\r
-                                                                       ringBeep();\r
-                                                               }\r
-                                                       }\r
-                                               }\r
-                                       }\r
-                                       else {\r
-                                               MWin.appendError(ERRID+"登録に失敗しました:"+r.getTitle()+"("+r.getCh_name()+")");\r
-                                       }\r
-                                       \r
-                                       if ( ! recorder.getErrmsg().equals("")) {\r
-                                               MWin.appendMessage(MSGID+"[追加情報] "+recorder.getErrmsg());\r
-                                               ringBeep();\r
-                                       }\r
-                                       \r
-                                       break;  // 一回限り\r
-                               }\r
-                               return null;\r
-                       }\r
-                       \r
-                       @Override\r
-                       protected void doFinally() {\r
-                               //CommonUtils.milSleep(0);\r
-                               StWin.setVisible(false);\r
-                       }\r
-               }.execute();\r
-               \r
-               CommonSwingUtils.setLocationCenter(parent, (Component)StWin);\r
-               StWin.setVisible(true);\r
+               setResizable(false);\r
                \r
-               //setVisible(false);\r
-               resetWhenWindowClosed();\r
-               dispose();\r
-       }\r
-       \r
-       /**\r
-        * 更新処理\r
-        * @see #doRecord()\r
-        */\r
-       public void doUpdate() {\r
-               if (vals.likeRsvList.size() <= 0) {\r
-                       return;\r
-               }\r
+               setTitle(getViewName());\r
                \r
-               // 更新処理\r
-               final ReserveList newRsv = vals.selectedLikeRsv.getRsv().clone();\r
-               //newRsv.setNo(-1);\r
-               //newRsv.setId(null);\r
-               newRsv.setRec_pattern((String)jComboBox_date.getSelectedItem());\r
-               newRsv.setRec_pattern_id(-1);           // UpdateRdEntry()中で取得するのでここはダミー\r
-               newRsv.setRec_nextdate("");             // UpdateRdEntry()中で取得するのでここはダミー\r
-               newRsv.setAhh(String.format("%02d", Integer.valueOf(getJTextField_ahh().getText())));\r
-               newRsv.setAmm(String.format("%02d", Integer.valueOf(getJTextField_amm().getText())));\r
-               newRsv.setZhh(String.format("%02d", Integer.valueOf(getJTextField_zhh().getText())));\r
-               newRsv.setZmm(String.format("%02d", Integer.valueOf(getJTextField_zmm().getText())));\r
-               newRsv.setRec_min("");                  // UpdateRdEntry()中で取得するのでここはダミー\r
-               newRsv.setTuner((String)jCBXPanel_encoder.getSelectedItem());\r
-               newRsv.setRec_mode((String)jCBXPanel_videorate.getSelectedItem());;\r
-               newRsv.setRec_audio((String)jCBXPanel_audiorate.getSelectedItem());\r
-               newRsv.setRec_folder((String)jCBXPanel_folder.getSelectedItem());\r
-               newRsv.setRec_genre((String)jCBXPanel_genre.getSelectedItem());\r
-               newRsv.setRec_subgenre((String)jCBXPanel_subgenre.getSelectedItem());\r
-               newRsv.setRec_dvdcompat((String)jCBXPanel_dvdcompat.getSelectedItem());\r
-               newRsv.setRec_device((String)jCBXPanel_device.getSelectedItem());\r
-               // 自動チャプタ関連\r
-               newRsv.setRec_xchapter((String)jCBXPanel_xChapter.getSelectedItem());\r
-               newRsv.setRec_mschapter((String)jCBXPanel_msChapter.getSelectedItem());\r
-               newRsv.setRec_mvchapter((String)jCBXPanel_mvChapter.getSelectedItem());\r
-               // その他\r
-               newRsv.setRec_aspect((String)jCBXPanel_aspect.getSelectedItem());\r
-               newRsv.setRec_bvperf((String)jCBXPanel_bvperf.getSelectedItem());\r
-               newRsv.setRec_lvoice((String)jCBXPanel_lvoice.getSelectedItem());\r
-               newRsv.setRec_autodel((String)jCBXPanel_autodel.getSelectedItem());\r
-               \r
-               //newRsv.setPursues(jCheckBox_Pursues.isSelected());\r
-               newRsv.setPursues(ITEM_YES.equals((String) jCBXPanel_pursues.getSelectedItem()));\r
-               \r
-               newRsv.setTitle((String)jComboBox_title.getSelectedItem());\r
-               newRsv.setTitlePop(TraceProgram.replacePop(newRsv.getTitle()));\r
-               newRsv.setDetail(jTextArea_detail.getText());\r
-               newRsv.setChannel("");                  // UpdateRdEntry()中で取得するのでここはダミー\r
-               newRsv.setCh_name((String)jComboBox_ch.getSelectedItem());\r
-               newRsv.setStartDateTime("");            // UpdateRdEntry()中で取得するのでここはダミー\r
-               newRsv.setEndDateTime("");              // UpdateRdEntry()中で取得するのでここはダミー\r
-               newRsv.setExec(jCheckBox_Exec.isSelected());\r
-               newRsv.setAutocomplete(jCheckBox_Autocomplete.isSelected());\r
-               newRsv.setUpdateOnlyExec(vals.isUpdateOnlyExec);\r
-               \r
-               newRsv.setContentId(vals.hide_content_id);\r
-\r
-               // 更新実行\r
-               StWin.clear();\r
-               new SwingBackgroundWorker(false) {\r
-                       \r
-                       @Override\r
-                       protected Object doWorks() throws Exception {\r
-                               \r
-                               StWin.appendMessage(MSGID+"予約を更新します:"+newRsv.getTitle());\r
-                               \r
-                               if ( vals.selectedLikeRsv.getRec().UpdateRdEntry(vals.selectedLikeRsv.getRsv(), newRsv) ) {\r
-                                       \r
-                                       // 成功したよ\r
-                                       MWin.appendMessage(MSGID+"正常に更新できました:"+vals.selectedLikeRsv.getRsv().getTitle()+"("+vals.selectedLikeRsv.getRsv().getCh_name()+")");\r
-                                       \r
-                                       doneReserve = true;\r
-                                       \r
-                                       // カレンダーを更新する\r
-                                       if ( vals.selectedLikeRsv.getRec().getUseCalendar() ) {\r
-                                               for ( HDDRecorder calendar : recorders.findInstance(RecType.CALENDAR) ) {\r
-                                                       \r
-                                                       StWin.appendMessage(MSGID+"カレンダーの予約情報を更新します");\r
-                                                       \r
-                                                       if ( ! calendar.UpdateRdEntry(vals.selectedLikeRsv.getRsv(), (jCheckBox_Exec.isSelected())?(newRsv):(null))) {\r
-                                                               MWin.appendError(ERRID+"[カレンダー] "+calendar.getErrmsg());\r
-                                                               ringBeep();\r
-                                                       }\r
-                                               }\r
-                                       }\r
-                               }\r
-                               else {\r
-                                       MWin.appendError(ERRID+"更新に失敗しました:"+vals.selectedLikeRsv.getRsv().getTitle()+"("+vals.selectedLikeRsv.getRsv().getCh_name()+")");\r
-                               }\r
-                               \r
-                               if ( ! vals.selectedLikeRsv.getRec().getErrmsg().equals("")) {\r
-                                       MWin.appendMessage(MSGID+"[追加情報] "+vals.selectedLikeRsv.getRec().getErrmsg());\r
-                                       ringBeep();\r
-                               }\r
-                               return null;\r
-                       }\r
-                       \r
-                       @Override\r
-                       protected void doFinally() {\r
-                               StWin.setVisible(false);\r
-                       }\r
-               }.execute();\r
-\r
-               StWin.setVisible(true);\r
-\r
-               vals.selectedLikeRsv = null;\r
+               // とりあえず起動時のみ設定可能\r
+               jPane_recsetting.setDebug(env.getDebug());\r
                \r
-               //setVisible(false);\r
-               resetWhenWindowClosed();\r
-               dispose();\r
+               addWindowListener(wl_opened);\r
        }\r
        \r
        \r
@@ -594,6 +176,10 @@ abstract class AbsReserveDialog extends JDialog implements HDDRecorderListener {
         * ダイアログオープン\r
         ******************************************************************************/\r
 \r
+       /***************************************\r
+        * 番組情報からのオープン2種+α\r
+        **************************************/\r
+       \r
        /**\r
         * 実行のON/OFFだけしか操作しない場合に呼び出す(画面にウィンドウは表示しない)\r
         * ※これがあるので、各openでは vals != null チェックの必要がある\r
@@ -603,11 +189,12 @@ abstract class AbsReserveDialog extends JDialog implements HDDRecorderListener {
                if (vals == null) vals = new Vals();\r
                \r
                vals.isUpdateOnlyExec = true;\r
-               jCheckBox_Exec.setSelected(b);\r
+               jPane_recsetting.setExecValue(b);\r
        }\r
        \r
        /**\r
-        *  類似予約抽出条件なしオープン\r
+        * 類似予約抽出条件なしオープン\r
+        * @see #doSelectLikeReserve(int)\r
         */\r
        public boolean open(ProgDetailList tvd) {\r
                return open(tvd,null,0);\r
@@ -615,9 +202,13 @@ abstract class AbsReserveDialog extends JDialog implements HDDRecorderListener {
        \r
        /**\r
         *  類似予約抽出条件ありオープン\r
+        * @see #doSelectLikeReserve(int)\r
         */\r
        public boolean open(ProgDetailList tvd, String keywordVal, int thresholdVal) {\r
                \r
+               // 予約は行われてないよー\r
+               doneReserve = false;\r
+               \r
                if (recorders.size() == 0) {\r
                        return false;   // レコーダがひとつもないのはやばい\r
                }\r
@@ -628,436 +219,378 @@ abstract class AbsReserveDialog extends JDialog implements HDDRecorderListener {
                // 初期パラメータの保存場所\r
                if (vals == null) vals = new Vals();\r
                \r
-               // 番組ID取得ボタン\r
-               getEventIdOnOpen(tvd);\r
-               setGetEventIdButton(tvd.progid,true);\r
-               \r
                // 選択中のレコーダ\r
                String myself = getSelectedRecorderId();                                // ツールバーで選択されているのはどれかな?\r
                HDDRecorder myrec = getSelectedRecorderList().get(0);   // 先頭を選んでおけばおけ\r
                \r
-               // 隠しパラメータ\r
-               vals.hide_tvd = tvd;\r
-               vals.hide_content_id = tvd.progid;\r
-               vals.hide_startdatetime = tvd.startDateTime;\r
-               vals.hide_atreservedlist = false;\r
+               vals.hide_recorder = myrec;     // 隠しパラメータ\r
+               vals.hide_tvd = tvd;            // 隠しパラメータ\r
+               \r
+               // ダイアログオープン時に自動で取得する\r
+               if ( env.getAutoEventIdComplete() ) {\r
+                       tvd.progid = getEventIdOnOpen(tvd);\r
+               }\r
                \r
                // 類似予約抽出条件\r
                if ( thresholdVal > 0 ) {\r
-                       vals.keyword = keywordVal;\r
-                       vals.threshold = thresholdVal;\r
+                       vals.keyword = keywordVal;              // 隠しパラメータ\r
+                       vals.threshold = thresholdVal;  // 隠しパラメータ\r
                }\r
 \r
                // 類似予約情報\r
                ReserveList myrsv = null;\r
-               vals.likeRsvList = findLikeReserves(vals.hide_tvd, vals.keyword, vals.threshold);\r
+               int myrsvidx = -1;\r
+               LikeReserveList likersvlist = findLikeReserves(tvd, vals.keyword, vals.threshold);      // 類似予約リストの作成\r
                if ( env.getGivePriorityToReserved() ) {\r
-                       // 類似予約が優先される場合\r
-                       if ( vals.likeRsvList.size() > 0 ) {\r
-                               LikeReserveItem lr = vals.likeRsvList.getClosest(myself);\r
-                               if ( lr != null ) {\r
-                                       // 選択中のレコーダの類似予約があれば\r
-                                       myrec = lr.getRec();\r
-                                       myrsv = lr.getRsv();\r
-                                       vals.selectedLikeRsv = lr;\r
-                                       \r
-                                       if ( myself == HDDRecorder.SELECTED_ALL || myself == HDDRecorder.SELECTED_PICKUP ) {\r
-                                               // "すべて" or "ピックアップのみ"\r
-                                               if (debug) System.out.println(DBGID+"選択中のレコーダがないので先頭の類似予約を使う: "+myself);\r
-                                       }\r
-                               }\r
-                               else {\r
-                                       // 類似予約があってもコンボボックスで選択したレコーダのものがない場合は無視\r
-                                       if (debug) System.out.println(DBGID+"類似予約に選択中のレコーダのものはなかった: "+myself);\r
-                               }\r
+                       // 類似予約が優先される\r
+                       LikeReserveItem likersv = findClosestLikeReserve(likersvlist, myself);          // 類似予約の絞り込み\r
+                       if ( likersv != null ) {\r
+                               myrsvidx = likersvlist.getClosestIndex();\r
+                               myrsv = likersv.getRsv();\r
+                               myrec = likersv.getRec();\r
                        }\r
                }\r
                \r
-               // ジャンル別AV設定の確認\r
+               vals.hide_likersvlist = likersvlist;    // 隠しパラメータ\r
+               \r
+               // ジャンル別AV設定の確認(該当するものがあれば)\r
                AVs myavs = null;\r
                if ( myrsv == null ) {\r
                        // 類似予約がないか、あっても優先されない場合\r
-                       myavs = getSelectedAVs(vals.hide_tvd.genre, vals.hide_tvd.center, myrec.getRecorderId());\r
+                       myavs = findAVs(tvd.genre, tvd.center, myrec.getRecorderId());\r
                }\r
                else {\r
-                       MWin.appendMessage(MSGID+"ç\94»è³ªã\83»é\9f³è³ªã\81¯é¡\9eä¼¼äº\88ç´\84ã\81®è¨­å®\9aã\81\8cç¶\99æ\89¿ã\81\95ã\82\8cã\81¾ã\81\99");\r
+                       MWin.appendMessage(MSGID+"ç\94»è³ªã\83»é\9f³è³ªã\82\92é¡\9eä¼¼äº\88ç´\84ã\81\8bã\82\89ç¶\99æ\89¿ã\81\97ã\81¾ã\81\99.");\r
                }\r
                \r
-               // 予約情報\r
-               vals.hide_default_recorder = myrec;\r
+               vals.hide_avs = myavs;  // 隠しパラメータ\r
+\r
+               // 類似予約リストのアイテム設定\r
+               setLikeRsvItems(likersvlist);\r
                \r
-               return _open(myself, myrec, myrsv, myavs);\r
-                               \r
+               // 初期値の選択\r
+               if ( env.getGivePriorityToReserved() && myrsv != null ) {\r
+                       // それっぽい類似予約を選択する\r
+                       jPane_likersv.setRowSelection(myrsvidx);\r
+               }\r
+               else {\r
+                       // 番組情報から選択する\r
+                       jPane_likersv.setRowSelection(LikeReserveEditorPanel.LIKERSVTABLE_NONE);\r
+               }\r
+               \r
+               return true;\r
        }\r
        \r
+       /***************************************\r
+        * 予約情報からのオープン1種\r
+        **************************************/\r
+       \r
        /**\r
         * 本体予約一覧からのオープン、または予約ON/OFFメニュー\r
+        * @see #doSelectLikeReserve(int)\r
         */\r
        public boolean open(String myself, String rsvId) {\r
                \r
-               HDDRecorderList recs = recorders.findInstance(myself);\r
-               if ( recs.size() == 0 ) {\r
+               // 予約は行われてないよー\r
+               doneReserve = false;\r
+               \r
+               HDDRecorderList myrecs = recorders.findInstance(myself);\r
+               if ( myrecs.size() == 0 ) {\r
                        return false;   // ここに来たらバグ\r
                }\r
-               HDDRecorder myrec = recs.get(0);\r
+               HDDRecorder myrec = myrecs.get(0);\r
 \r
                ReserveList myrsv = myrec.getReserveList(rsvId);\r
                if ( myrsv == null ) {\r
+                       MWin.appendMessage(ERRID+"更新すべき予約情報が見つかりません: "+myself+", "+rsvId);\r
+                       ringBeep();\r
                        return false;   // ここに来たらバグ\r
                }\r
+               if ( myrsv.getCh_name() == null ) {\r
+                       MWin.appendMessage(ERRID+"予約情報の放送局名が不正です: "+myrsv.getStartDateTime()+", "+myrsv.getTitle());\r
+                       ringBeep();\r
+                       return false;\r
+               }\r
 \r
                // 初期パラメータの保存場所\r
                if (vals == null) vals = new Vals();\r
                \r
-               // 番組ID取得ボタンを無効にする\r
-               setGetEventIdButton(null,false);\r
-\r
                // 予約情報から番組情報を組み立てる\r
-               ProgDetailList tvd = new ProgDetailList();\r
-               CommonUtils.getNextDate(myrsv);\r
-               tvd.center = myrsv.getCh_name();\r
-               tvd.title = myrsv.getTitle();\r
-               tvd.detail = myrsv.getDetail();\r
-               tvd.start = myrsv.getAhh()+":"+myrsv.getAmm();\r
-               tvd.end = myrsv.getZhh()+":"+myrsv.getZmm();\r
-               //tvd.accurateDate = myrsv.getRec_pattern();            // これは特殊\r
-               tvd.progid = myrsv.getContentId();\r
-               tvd.genre = ProgGenre.get(myrsv.getRec_genre());\r
-               tvd.subgenre = ProgSubgenre.get(tvd.genre,myrsv.getRec_subgenre());\r
-               \r
-               // 予約情報から類似予約情報を組み立てる\r
-               LikeReserveItem likersv = new LikeReserveItem(myrec,myrsv,0);\r
+               ProgDetailList tvd = getProgDetails(myrsv);\r
                \r
-               // 隠しパラメータ\r
-               vals.hide_tvd = tvd;\r
-               vals.hide_content_id = null;\r
-               vals.hide_startdatetime = null; // 予約一覧からは番組IDの取得はできないので開始日時は保存しない\r
-               vals.hide_atreservedlist = true;\r
+               vals.hide_recorder = myrec;     // 隠しパラメータ\r
+               vals.hide_tvd = tvd;            // 隠しパラメータ\r
 \r
-               // 予約情報\r
-               vals.selectedLikeRsv = likersv; \r
-               vals.likeRsvList = new LikeReserveList();\r
-               vals.likeRsvList.add(vals.selectedLikeRsv);\r
-\r
-               vals.hide_default_recorder = myrec;\r
+               // 予約情報(類似予約の一個目として設定)\r
+               LikeReserveList likersvlist = new LikeReserveList();\r
+               likersvlist.add(new LikeReserveItem(myrec, myrsv, 0));\r
+               \r
+               vals.hide_likersvlist = likersvlist;    // 隠しパラメータ\r
+               \r
+               // 類似予約リストのアイテム設定\r
+               setLikeRsvItems(likersvlist);\r
+               \r
+               // 初期値の選択(類似予約の一個目を選択)\r
+               jPane_likersv.setRowSelection(0);\r
 \r
-               return _open(myself, myrec, myrsv, null);\r
+               // 各コンポーネントの強制状態変更\r
+               jPane_title.setEnabledRecordButton(false);      // 新規ボタンは操作不能に\r
+               jPane_likersv.setEnabledTable(false);           // 類似予約は選択不能に\r
+               \r
+               return true;\r
        }\r
        \r
+       /***************************************\r
+        * オープン用部品\r
+        **************************************/\r
+       \r
        /**\r
-        * ダイアログオープン(共通処理)\r
+        * 類似予約リストの取得\r
         */\r
-       private boolean _open(String myself, HDDRecorder myrec, ReserveList myrsv, AVs myavs) {\r
+       private LikeReserveItem findClosestLikeReserve(LikeReserveList lrl, String myself) {\r
                \r
-               // 予約は行われてないよー\r
-               doneReserve = false;\r
-               \r
-               if ( vals.hide_content_id == null || ! ContentIdEDCB.isValid(vals.hide_content_id) ) {\r
-                       if ( myrsv != null && ContentIdEDCB.isValid(myrsv.getContentId()) ) {\r
-                               vals.hide_content_id = myrsv.getContentId();\r
-                               setGetEventIdButton(vals.hide_content_id,false);\r
-                       }\r
+               if ( lrl.size() == 0 ) {\r
+                       // 類似予約がない\r
+                       return null;\r
                }\r
-\r
-               // 一旦選択系リスナーは全部止めてしまう\r
-               setEnabledSelectionListeners(false);\r
-               \r
-               // 初期値を設定(固定部分)\r
-               setInitFixies(myrec, myrsv);\r
-\r
-               // 初期値を設定(可変部分)\r
-               setInitVariables(myrec);\r
-\r
-               // 初期値を選択\r
-               setSelectedVariables(myrec, myrsv, myavs, null, null);\r
-               \r
-               // 項目ラベルのオーバーライド\r
-               setLabels(myrec);\r
-\r
-               // リスナーを全部戻す\r
-               setEnabledSelectionListeners(true);\r
-               \r
-               // 選択行が表示されるようにする\r
-               CommonSwingUtils.setSelectedRowShown(jtbl_likersv);\r
                \r
-               // リセット用データ収集\r
-               {\r
-                       vals.isExtended = jCheckBox_spoex_extend.isSelected();\r
-                       vals.isClipped = jCheckBox_OverlapDown2.isSelected();\r
-                       vals.byDateIni = (String) jComboBox_date.getItemAt(0);\r
-                       vals.byWeeklyIni = (String) jComboBox_date.getItemAt(1);\r
-                       vals.ahh = jTextField_ahh.getText();\r
-                       vals.amm = jTextField_amm.getText();\r
-                       vals.zhh = jTextField_zhh.getText();\r
-                       vals.zmm = jTextField_zmm.getText();\r
+               LikeReserveItem lr = lrl.getClosest(myself);\r
+               if ( lr == null ) {\r
+                       // 類似予約があってもコンボボックスで選択したレコーダのものがない\r
+                       if (debug) System.out.println(DBGID+"類似予約に選択中のレコーダのものはなかった: "+myself);\r
+                       return null;\r
                }\r
                \r
-               return(true);\r
+               // 選択中のレコーダの類似予約があった\r
+               return lr;\r
        }\r
        \r
        /**\r
-        * open()時に設定したら内容の変更のないコンボボックスの選択肢の設定\r
-        * @see #setInitVariables\r
+        * ジャンル別AV設定の取得\r
         */\r
-       private void setInitFixies(HDDRecorder myrec, ReserveList myrsv) {\r
-               // レコーダコンボボックスの設定\r
-               {\r
-                       jCBXPanel_recorder.removeAllItems();\r
-                       for ( HDDRecorder rec : recorders ) {\r
-                               if ( rec.isBackgroundOnly() ) {\r
-                                       continue;       // Googleカレンダープラグインとかははずす\r
-                               }\r
-                               jCBXPanel_recorder.addItem(rec.Myself());\r
-                       }\r
-                       jCBXPanel_recorder.setEnabled( jCBXPanel_recorder.getItemCount() > 0 );\r
-                       \r
-                       if ( vals.hide_atreservedlist ) {\r
-                               jCBXPanel_recorder.setEnabled(false);\r
-                       }\r
-                       else {\r
-                               jCBXPanel_recorder.setEnabled(true);\r
-                       }\r
-               }\r
+       private AVs findAVs(ProgGenre key_genre, String key_webChName, String recId) {\r
                \r
-               // 予約名\r
-               {\r
-                       jComboBox_title.removeAllItems();\r
-                       jComboBox_title.addItem(vals.hide_tvd.title);\r
-                       for ( LikeReserveItem ll : vals.likeRsvList ) {\r
-                               for ( int i=0; i<jComboBox_title.getItemCount(); i++ ) {\r
-                                       String t = (String) jComboBox_title.getItemAt(i);\r
-                                       if ( t != null && ! t.equals(ll.getRsv().getTitle()) ) {\r
-                                               jComboBox_title.addItem(ll.getRsv().getTitle());\r
-                                               break;\r
-                                       }\r
-                               }\r
-                       }\r
-                       \r
-                       // 予約名の初期選択\r
-                       if ( env.getGivePriorityToReserved() && env.getGivePriorityToReservedTitle() && myrsv != null ) {\r
-                               jComboBox_title.setSelectedItem(myrsv.getTitle());\r
-                       }\r
-                       ((JTextField)jComboBox_title.getEditor().getEditorComponent()).setCaretPosition(0);\r
+               String selected_key = key_genre.toString();\r
+               AVSetting xavs = avs;\r
+               if ( env.getEnableCHAVsetting() ) {\r
+                       selected_key = key_webChName;\r
+                       xavs = chavs;\r
                }\r
                \r
-               // 詳細\r
-               {\r
-                       jTextArea_detail.setText(vals.hide_tvd.detail+"\n"+vals.hide_tvd.getAddedDetail());\r
-                       jTextArea_detail.setCaretPosition(0);\r
-               }\r
-\r
-               // ジャンル\r
-               {\r
-                       jCBXPanel_genre.removeAllItems();\r
-                       jCBXPanel_subgenre.removeAllItems();\r
-                       \r
-                       for ( ProgGenre g : ProgGenre.values() ) {\r
-                               jCBXPanel_genre.addItem(g.toString());\r
-                       }\r
-                       jCBXPanel_genre.setEnabled( jCBXPanel_genre.getItemCount() > 0 );\r
-                       \r
-                       if ( vals.hide_tvd.subgenre == null ) {\r
-                               jCBXPanel_subgenre.setEnabled(false);\r
+               AVs myavs = xavs.getSelectedAVs(selected_key, recId);\r
+               if ( myavs != null ) {\r
+                       if ( myavs.getGenre() != null ) {\r
+                               MWin.appendMessage(MSGID+"画質・音質を自動設定します: "+recId+" & "+myavs.getGenre());\r
                        }\r
                        else {\r
-                               for ( ProgSubgenre sg : ProgSubgenre.values(vals.hide_tvd.genre)) {\r
-                                       jCBXPanel_subgenre.addItem(sg.toString());\r
-                               }\r
-                               jCBXPanel_subgenre.setEnabled( jCBXPanel_subgenre.getItemCount() > 0 );\r
-                       }\r
-                       \r
-                       // ジャンルの初期選択\r
-                       if ( vals.hide_tvd.genre != null ) {\r
-                               jCBXPanel_genre.setSelectedItem(vals.hide_tvd.genre.toString());\r
-                               if ( vals.hide_tvd.subgenre != null ) {\r
-                                       jCBXPanel_subgenre.setSelectedItem(vals.hide_tvd.subgenre.toString());\r
-                               }\r
+                               MWin.appendMessage(MSGID+"画質・音質にデフォルト設定を適用します: "+recId);\r
                        }\r
                }\r
+               else {\r
+                       MWin.appendMessage(MSGID+"画質・音質の自動設定候補がありません: "+recId+" & "+selected_key);\r
+               }\r
                \r
-               boolean OverlapException = false;       // 日付コンボボックスでも使うよ\r
+               return myavs;\r
+       }\r
+       \r
+       /**\r
+        * 番組情報から予約情報を生成する\r
+        */\r
+       private ReserveList getReserveList(HDDRecorder recorder, String enc) {\r
                \r
-               // 開始・終了時刻は長いよ\r
-               {\r
-                       int ahh = Integer.valueOf(vals.hide_tvd.start.substring(0,vals.hide_tvd.start.indexOf(":")));\r
-                       int amm = Integer.valueOf(vals.hide_tvd.start.substring(vals.hide_tvd.start.indexOf(":")+1,vals.hide_tvd.start.length()));\r
-                       int zhh = Integer.valueOf(vals.hide_tvd.end.substring(0,vals.hide_tvd.end.indexOf(":")));\r
-                       int zmm = Integer.valueOf(vals.hide_tvd.end.substring(vals.hide_tvd.end.indexOf(":")+1,vals.hide_tvd.end.length()));\r
-                       \r
-                       if ( ! vals.hide_atreservedlist ) {\r
-                               // のりしろ処理\r
-                               if (env.getOverlapUp() == true) {\r
-                                       int a = ahh*60+amm-1;\r
-                                       if (a<0) {\r
-                                               a+=24*60;\r
-                                               OverlapException = true;\r
-                                       }\r
-                                       amm = a % 60;\r
-                                       ahh = (a-amm)/60;\r
-                               }\r
-                               if (env.getOverlapDown() == true) {\r
-                                       int z = zhh*60+zmm+1;\r
-                                       zmm = z % 60;\r
-                                       zhh = (z-zmm)/60%24;\r
-                                       jCheckBox_OverlapDown2.setSelected(false);\r
-                                       jCheckBox_OverlapDown2.setForeground(Color.BLACK);\r
-                               }\r
-                               else if (\r
-                                               env.getOverlapDown2() == true &&\r
-                                               ! vals.hide_tvd.dontoverlapdown &&                      // NHKは縮めない\r
-                                               ! (env.getNoOverlapDown2Sp() && vals.hide_tvd.option.contains(ProgOption.SPECIAL))      // OVAとかは縮めない \r
-                                               ) {\r
-                                       jCheckBox_OverlapDown2.setSelected(true);\r
-                                       jCheckBox_OverlapDown2.setForeground(Color.RED);\r
-                                       int z = zhh*60+zmm-1;\r
-                                       if (z<0) {\r
-                                               z+=24*60;\r
-                                       }\r
-                                       zmm = z % 60;\r
-                                       zhh = (z-zmm)/60%24;\r
-                               }\r
-                               else {\r
-                                       jCheckBox_OverlapDown2.setSelected(false);\r
-                                       jCheckBox_OverlapDown2.setForeground(Color.BLACK);\r
-                               }\r
-                               \r
-                               // 延長警告処理\r
-                               int spoexLength = Integer.valueOf(env.getSpoexLength());\r
-                               if (vals.hide_tvd.extension == true && spoexLength>0) {\r
-                                       jCheckBox_spoex_extend.setSelected(true);\r
-                                       jCheckBox_spoex_extend.setForeground(Color.RED);\r
-                                       int z = zhh*60+zmm+spoexLength;\r
-                                       zmm = z % 60;\r
-                                       zhh = (z-zmm)/60%24;\r
-                               }\r
-                               else {\r
-                                       jCheckBox_spoex_extend.setSelected(false);\r
-                                       jCheckBox_spoex_extend.setForeground(Color.BLACK);\r
-                               }\r
-                       }\r
-                       else {\r
-                               jCheckBox_spoex_extend.setEnabled(false);\r
-                               jCheckBox_spoex_extend.setSelected(false);\r
-                               jCheckBox_spoex_extend.setForeground(Color.BLACK);\r
-                               jCheckBox_OverlapDown2.setEnabled(false);\r
-                               jCheckBox_OverlapDown2.setSelected(false);\r
-                               jCheckBox_OverlapDown2.setForeground(Color.BLACK);\r
-                       }\r
-                       \r
-                       jTextField_ahh.setText(String.format("%02d", ahh));\r
-                       jTextField_amm.setText(String.format("%02d", amm));\r
-                       jTextField_zhh.setText(String.format("%02d", zhh));\r
-                       jTextField_zmm.setText(String.format("%02d", zmm));\r
-               }\r
+               ReserveList r = new ReserveList();\r
+               \r
+               // チューナー\r
+               r.setTuner(enc);\r
+               \r
+               // 画質・音質\r
+               r.setRec_mode(getDefaultText(recorder, recorder.getVideoRateList()));\r
+               r.setRec_audio(getDefaultText(recorder, recorder.getAudioRateList()));\r
+               r.setRec_folder(getDefaultText(recorder, recorder.getFolderList()));\r
 \r
-               // 録画日付(のりしろ処理が必要な場合あり)\r
-               {\r
-                       jComboBox_date.removeAllItems();\r
-                       if ( ! vals.hide_atreservedlist ) {\r
-                               // リスト/新聞形式からの呼び出しなら番組情報をもとに\r
-                               GregorianCalendar c = CommonUtils.getCalendar(vals.hide_tvd.accurateDate);\r
-                               if ( c != null ) {\r
-                                       if (OverlapException == true) {\r
-                                               c.add(Calendar.DATE, -1);\r
-                                       }\r
-                                       jComboBox_date.addItem(CommonUtils.getDate(c));\r
-                                       jComboBox_date.addItem(HDDRecorder.RPTPTN[c.get(Calendar.DAY_OF_WEEK)-Calendar.SUNDAY]);\r
-                               }\r
-                       }\r
-                       else {\r
-                               // 本体予約一覧からの呼び出しなら既存の予約情報からの引継ぎ\r
-                               GregorianCalendar c = CommonUtils.getCalendar(myrsv.getRec_pattern());\r
-                               if ( c != null ) {\r
-                                       jComboBox_date.addItem(myrsv.getRec_pattern());\r
-                                       jComboBox_date.addItem(HDDRecorder.RPTPTN[c.get(Calendar.DAY_OF_WEEK)-Calendar.SUNDAY]);\r
-                               }\r
-                               else {\r
-                                       jComboBox_date.addItem(myrsv.getRec_nextdate());\r
-                                       jComboBox_date.addItem(myrsv.getRec_pattern());\r
-                               }\r
-                       }\r
-                       jComboBox_date.addItem(HDDRecorder.RPTPTN[7]);\r
-                       jComboBox_date.addItem(HDDRecorder.RPTPTN[8]);\r
-                       jComboBox_date.addItem(HDDRecorder.RPTPTN[9]);\r
-                       jComboBox_date.addItem(HDDRecorder.RPTPTN[10]);\r
+               r.setRec_dvdcompat(getDefaultText(recorder, recorder.getDVDCompatList()));\r
+               r.setRec_device(getDefaultText(recorder, recorder.getDeviceList()));\r
+               \r
+               // 自動チャプタ関連\r
+               r.setRec_xchapter(getDefaultText(recorder, recorder.getXChapter()));\r
+               r.setRec_mschapter(getDefaultText(recorder, recorder.getMsChapter()));\r
+               r.setRec_mvchapter(getDefaultText(recorder, recorder.getMvChapter()));\r
+               \r
+               // その他\r
+               r.setRec_aspect(getDefaultText(recorder, recorder.getAspect()));\r
+               r.setRec_bvperf(getDefaultText(recorder, recorder.getBVperf()));\r
+               r.setRec_lvoice(getDefaultText(recorder, recorder.getLVoice()));\r
+               r.setRec_autodel(getDefaultText(recorder, recorder.getAutodel()));\r
+               \r
+               r.setExec(true);\r
+               \r
+               return r;\r
+       }\r
+       \r
+       private String getDefaultText(HDDRecorder myrec, ArrayList<TextValueSet> tvs) {\r
+               TextValueSet t = myrec.getDefaultSet(tvs);\r
+               if ( t != null ) {\r
+                       return t.getText();\r
                }\r
+               if ( tvs.size() > 0 ) {\r
+                       return tvs.get(0).getText();\r
+               }\r
+               return null;\r
+       }\r
+       \r
+       /**\r
+        * 予約情報から番組情報を生成する\r
+        */\r
+       private ProgDetailList getProgDetails(ReserveList myrsv) {\r
+               \r
+               ProgDetailList tvd = new ProgDetailList();\r
+               \r
+               tvd.title = myrsv.getTitle();\r
+               tvd.detail = myrsv.getDetail();\r
+               \r
+               tvd.center = myrsv.getCh_name();\r
                \r
-               // 類似予約コンボボックスと抽出条件、その関連\r
                {\r
-                       //vals.likeRsvList.clear();\r
-                       int selectedrow = LIKERSVTABLE_NOTSELECTED;\r
-                       if ( ! vals.hide_atreservedlist ) {\r
-                               jButton_record.setForeground(Color.RED);\r
-                               jButton_record.setEnabled(true);\r
-                               if ( vals.likeRsvList.size() > 0 ) {\r
-                                       //jButton_update.setForeground(Color.RED);\r
-                                       //jButton_update.setEnabled(true);\r
-                                       jtbl_likersv.setEnabled(true);\r
-                                       \r
-                                       // 類似予約中の一番近い予約を探す\r
-                                       long score = 86400;\r
-                                       if ( env.getGivePriorityToReserved() ) {\r
-                                               for ( int i=0; i<vals.likeRsvList.size(); i++) {\r
-                                                       if ( vals.likeRsvList.getRec(i).isMyself(myrec.Myself()) ) {\r
-                                                               long sc = CommonUtils.getDiffDateTime(vals.likeRsvList.getRsv(i).getStartDateTime(), vals.hide_tvd.startDateTime);\r
-                                                               if ( selectedrow == -1 || score > sc ) {\r
-                                                                       selectedrow = i;\r
-                                                                       score = sc;\r
-                                                               }\r
-                                                       }\r
-                                               }\r
-                                       }\r
-\r
-                               }\r
-                               else {\r
-                                       jtbl_likersv.setEnabled(false);\r
-                               }\r
-                       }\r
-                       else {\r
-                               // 本体予約一覧の場合は1個だけ追加すればよい\r
-                               jButton_record.setForeground(Color.GRAY);\r
-                               jButton_record.setEnabled(false);\r
-                               jtbl_likersv.setEnabled(false);\r
-                               selectedrow = 0;\r
-                               //vals.likeRsvList.add(new LikeReserveItem(myrec,myrsv));\r
-                       }\r
-\r
-                       ((DefaultTableModel)jtbl_likersv.getModel()).fireTableDataChanged();\r
-                       ((DefaultTableModel)jrhdr_likersv.getModel()).fireTableDataChanged();\r
+                       String nextdate = CommonUtils.getNextDate(myrsv);\r
+                       GregorianCalendar ca = CommonUtils.getCalendar(nextdate);\r
                        \r
-                       jtbl_likersv.setRowSelectionInterval(selectedrow,selectedrow);\r
+                       ca.add(Calendar.HOUR_OF_DAY, Integer.valueOf(myrsv.getAhh())-ca.get(Calendar.HOUR_OF_DAY));\r
+                       ca.add(Calendar.MINUTE, Integer.valueOf(myrsv.getAmm())-ca.get(Calendar.MINUTE));\r
+                       tvd.startDateTime = CommonUtils.getDateTime(ca);\r
+                       tvd.start = CommonUtils.getTime(ca);\r
 \r
-                       setEnabledUpdateButton(jtbl_likersv.getSelectedRow());\r
+                       ca.add(Calendar.MINUTE, Integer.valueOf(myrsv.getRec_min()));\r
+                       tvd.endDateTime = CommonUtils.getDateTime(ca);\r
+                       tvd.end = CommonUtils.getTime(ca);\r
                }\r
+               \r
+               tvd.progid = myrsv.getContentId();\r
+               \r
+               tvd.genre = ProgGenre.get(myrsv.getRec_genre());\r
+               tvd.subgenre = ProgSubgenre.get(tvd.genre,myrsv.getRec_subgenre());\r
+               \r
+               // 特殊\r
+               tvd.accurateDate = null;\r
+               tvd.dontoverlapdown = true;\r
+               \r
+               return tvd;\r
+       }\r
+       \r
+       /***************************************\r
+        * 番組情報部の設定\r
+        **************************************/\r
+       \r
+       private TimeVal setTitleItems(HDDRecorder myrec, ProgDetailList tvd, LikeReserveList lrl, boolean atrsvlst) {\r
+               \r
+               jPane_title.setContentIdValue(tvd.progid, ! atrsvlst);\r
+               jPane_title.setTitleItems(tvd, lrl, env.getUseAutocomplete());\r
+               jPane_title.setChItem(myrec, tvd);\r
+               \r
+               TimeVal tVal = getTimeValue(tvd);\r
+               jPane_title.setTimeValue(tVal);\r
+               jPane_title.setDateItems(tvd, tVal);\r
+               \r
+               return tVal;\r
+       }\r
+       \r
+       /***************************************\r
+        * 録画設定部の設定\r
+        **************************************/\r
+       \r
+       private void setRecSettingItems(HDDRecorderList reclst, HDDRecorder myrec, ProgDetailList tvd) {\r
+               \r
+               jPane_recsetting.setLabels(myrec);                                      // 項目ラベル\r
+               jPane_recsetting.setFixedItems(reclst);                         // 固定アイテム\r
+               jPane_recsetting.setFlexItems(myrec,tvd.center);        // 可変アイテム\r
+       }\r
+       \r
+       /***************************************\r
+        * 類似予約部の設定\r
+        **************************************/\r
+       \r
+       private void setLikeRsvItems(LikeReserveList lrl) {\r
+               jPane_likersv.setListItems(lrl);\r
        }\r
        \r
+       \r
+       /*******************************************************************************\r
+        * ほげほげ\r
+        ******************************************************************************/\r
+       \r
        /**\r
-        * 更新ボタンの有効無効\r
+        * 延長警告などを加味した録画開始・終了日時を算出する\r
         */\r
-       private void setEnabledUpdateButton(int selectedrow) {\r
-               if ( selectedrow == LIKERSVTABLE_NOTSELECTED ) {\r
-                       jButton_update.setForeground(Color.BLACK);\r
-                       jButton_update.setEnabled(false);\r
-               }\r
-               else {\r
-                       jButton_update.setForeground(Color.RED);\r
-                       jButton_update.setEnabled(true);\r
+       private TimeVal getTimeValue(ProgDetailList tvd) {\r
+               \r
+               TimeVal tVal = new TimeVal();\r
+               \r
+               GregorianCalendar ca = CommonUtils.getCalendar(tvd.startDateTime);\r
+               GregorianCalendar cz = CommonUtils.getCalendar(tvd.endDateTime);\r
+               \r
+               if ( tvd.accurateDate != null ) {\r
+                       // のりしろ処理(開始時刻)\r
+                       if ( env.getOverlapUp() ) {\r
+                               // 開始1分前倒し\r
+                               ca.add(Calendar.MINUTE, -1);\r
+                               \r
+                               tVal.margined = true;\r
+                       }\r
+                       \r
+                       // のりしろ処理(終了時刻)\r
+                       if ( env.getOverlapDown() ) {\r
+                               // 終了1分延長\r
+                               cz.add(Calendar.MINUTE, +1);\r
+                       }\r
+                       else if (\r
+                                       env.getOverlapDown2() &&\r
+                                       ! tvd.dontoverlapdown &&                        // NHKは縮めない\r
+                                       ! (env.getNoOverlapDown2Sp() && tvd.option.contains(ProgOption.SPECIAL))        // OVAとかは縮めない \r
+                                       ) {\r
+                               // 終了1分前倒し\r
+                               cz.add(Calendar.MINUTE, -1);\r
+                               \r
+                               tVal.clipped = true;\r
+                       }\r
+                       \r
+                       // 延長警告処理\r
+                       int spoexlen = Integer.valueOf(env.getSpoexLength());\r
+                       if ( tvd.extension == true && spoexlen > 0 ) {\r
+                               // 指定時間分延長\r
+                               cz.add(Calendar.MINUTE, +spoexlen);\r
+                               \r
+                               tVal.spoex = true;\r
+                               tVal.spoexlen = spoexlen;\r
+                       }\r
                }\r
+               \r
+               tVal.date = CommonUtils.getDate(ca);\r
+               \r
+               tVal.ahh = ca.get(Calendar.HOUR_OF_DAY);\r
+               tVal.amm = ca.get(Calendar.MINUTE);\r
+               tVal.zhh = cz.get(Calendar.HOUR_OF_DAY);\r
+               tVal.zmm = cz.get(Calendar.MINUTE);\r
+               \r
+               tVal.startDateTime = CommonUtils.getDateTime(ca);\r
+               tVal.endDateTime = CommonUtils.getDateTime(cz);\r
+\r
+               return tVal;\r
        }\r
        \r
+       \r
        /**\r
         * 他のコンボボックスの操作によって内容が変わるコンボボックスの選択肢の入れ替え\r
         * @see #setInitFixies\r
         */\r
+       /*\r
        private void setInitVariables(HDDRecorder myrec) {\r
                \r
                // 番組追従\r
                {\r
                        if ( myrec.isPursuesEditable() ) {\r
-                               jCBXPanel_pursues.setEnabled( ! ITEM_EVIDNEEDED.equals(jButton_getEventId.getText()));\r
+                               jPane_recsetting.setEnebledPursues( ! ITEM_EVIDNEEDED.equals(jButton_getEventId.getText()));\r
                        }\r
                        else {\r
-                               jCBXPanel_pursues.setEnabled(false);\r
+                               jPane_recsetting.setEnebledPursues(false);\r
                        }\r
                }\r
                \r
@@ -1073,15 +606,6 @@ abstract class AbsReserveDialog extends JDialog implements HDDRecorderListener {
                        jComboBox_ch.setEnabled( jComboBox_ch.getItemCount() > 0 );\r
                }\r
                \r
-               // エンコーダ\r
-               {\r
-                       jCBXPanel_encoder.removeAllItems();\r
-                       for ( String enc : getFilteredEncoders(myrec, vals.hide_tvd.center) ) {\r
-                               jCBXPanel_encoder.addItem(enc);\r
-                       }\r
-                       jCBXPanel_encoder.setEnabled( jCBXPanel_encoder.getItemCount() > 0 );\r
-               }\r
-               \r
                // 日付\r
                {\r
                        if ( myrec.isRepeatReserveSupported() ) {\r
@@ -1093,44 +617,22 @@ abstract class AbsReserveDialog extends JDialog implements HDDRecorderListener {
                        }\r
                }\r
                \r
-               // AV設定\r
-               refCBX(jCBXPanel_videorate, myrec.getVideoRateList());\r
-               refCBX(jCBXPanel_folder, myrec.getFolderList());\r
-               refCBX(jCBXPanel_audiorate, myrec.getAudioRateList());\r
-               \r
-               refCBX(jCBXPanel_device, myrec.getDeviceList());\r
-               refCBX(jCBXPanel_bvperf, myrec.getBVperf());\r
-               refCBX(jCBXPanel_dvdcompat, myrec.getDVDCompatList());\r
-               \r
-               refCBX(jCBXPanel_autodel, myrec.getAutodel());\r
-               refCBX(jCBXPanel_lvoice, myrec.getLVoice());\r
-               refCBX(jCBXPanel_aspect, myrec.getAspect());\r
+               // エンコーダ\r
+               jPane_recsetting.initEncoders(getFilteredEncoders(myrec, vals.hide_tvd.center));\r
                \r
-               refCBX(jCBXPanel_msChapter, myrec.getMsChapter());\r
-               refCBX(jCBXPanel_mvChapter, myrec.getMvChapter());\r
-               refCBX(jCBXPanel_xChapter, myrec.getXChapter());\r
-\r
-               {\r
-                       jCBXPanel_pursues.removeAllItems();\r
-                       jCBXPanel_pursues.addItem(ITEM_YES);\r
-                       jCBXPanel_pursues.addItem(ITEM_NO);\r
-               }\r
+               // AV設定\r
+               jPane_recsetting.initAVSettings(myrec);\r
        }\r
+       */\r
        \r
        /**\r
         * コンボボックス操作によって連動して選択しなおし\r
         */\r
+       /*\r
        private void setSelectedVariables(HDDRecorder myrec, ReserveList myrsv, AVs myavs, String mychname, String myenc) {\r
 \r
                // 予約実行\r
-               if ( myrsv == null ) {\r
-                       jCheckBox_Exec.setSelected(true);\r
-                       jCheckBox_Exec.setForeground(Color.BLACK);\r
-               }\r
-               else {\r
-                       jCheckBox_Exec.setSelected(myrsv.getExec());\r
-                       jCheckBox_Exec.setForeground((myrsv.getExec())?(Color.BLACK):(Color.RED));\r
-               }\r
+               jPane_recsetting.setExec((myrsv==null) ? true : myrsv.getExec());\r
                \r
                // タイトル\r
                if ( myrsv == null ) {\r
@@ -1162,61 +664,15 @@ abstract class AbsReserveDialog extends JDialog implements HDDRecorderListener {
                }\r
                \r
                // 番組追従\r
-               jCBXPanel_pursues.setEnabled(myrec.isPursuesEditable());\r
-               if ( ! vals.hide_atreservedlist ) {\r
-                       if ( myrec.isPursuesEditable() ) {\r
-                               jCBXPanel_pursues.setEnabled(true);\r
-                               if ( myrsv != null ) {\r
-                                       // 類似予約からの継承\r
-                                       jCBXPanel_pursues.setSelectedItem((myrsv.getPursues())?(ITEM_YES):(ITEM_NO));\r
-                               }\r
-                               else {\r
-                                       // デフォルトはON\r
-                                       if ( ITEM_EVIDNEEDED.equals(jButton_getEventId.getText()) ) {\r
-                                               jCBXPanel_pursues.setEnabled(false);\r
-                                               jCBXPanel_pursues.setSelectedItem(ITEM_NO);\r
-                                       }\r
-                                       else {\r
-                                               jCBXPanel_pursues.setSelectedItem(ITEM_YES);\r
-                                       }\r
-                               }\r
-                       }\r
-                       else {\r
-                               jCBXPanel_pursues.setEnabled(false);\r
-                               jCBXPanel_pursues.setSelectedItem(ITEM_NO);\r
-                       }\r
-               }\r
-               else {\r
-                       if ( myrec.isPursuesEditable() ) { \r
-                               // 既存予約の継承(番組IDが取得できるまではdisable)\r
-                               jCBXPanel_pursues.setEnabled( myrsv.getContentId() != null && myrsv.getContentId().length() > 0 );\r
-                               jCBXPanel_pursues.setSelectedItem((myrsv.getPursues())?(ITEM_YES):(ITEM_NO));\r
-                       }\r
-                       else {\r
-                               jCBXPanel_pursues.setEnabled(false);\r
-                               jCBXPanel_pursues.setSelectedItem((myrsv.getPursues())?(ITEM_YES):(ITEM_NO));\r
-                       }\r
-               }\r
+               jPane_recsetting.setPursues(myrec,myrsv,vals.hide_atreservedlist,ITEM_EVIDNEEDED.equals(jButton_getEventId.getText()));\r
 \r
                // レコーダ\r
-               jCBXPanel_recorder.setSelectedItem(myrec.Myself());\r
+               jPane_recsetting.setRecorder(myrec.Myself());\r
                \r
                // エンコーダ(移動しました)\r
                \r
                // サブジャンル\r
-               {\r
-                       ProgGenre mygenre = ProgGenre.get((String) jCBXPanel_genre.getSelectedItem());\r
-                       jCBXPanel_subgenre.removeAllItems();\r
-                       for ( ProgSubgenre sg : ProgSubgenre.values(mygenre) ) {\r
-                               jCBXPanel_subgenre.addItem(sg.toString());\r
-                       }\r
-                       if ( myrsv != null && mygenre == ProgGenre.get(myrsv.getRec_genre()) ) {\r
-                               jCBXPanel_subgenre.setSelectedItem(myrsv.getRec_subgenre());\r
-                       }\r
-                       else if ( mygenre == vals.hide_tvd.genre ) {\r
-                               jCBXPanel_subgenre.setSelectedItem(vals.hide_tvd.subgenre.toString());\r
-                       }\r
-               }\r
+               jPane_recsetting.setSubgenre(myrsv, vals.hide_tvd.genre, vals.hide_tvd.subgenre);\r
                \r
                // 連動するAV設定\r
                setSelectedAVItems(myrec.getRecorderId(), myrsv, myavs);\r
@@ -1225,7 +681,7 @@ abstract class AbsReserveDialog extends JDialog implements HDDRecorderListener {
                {\r
                        \r
                        if ( vals.hide_atreservedlist ) {\r
-                               jCBXPanel_encoder.setSelectedItem(myrsv.getTuner());\r
+                               jPane_recsetting.setEncoder(myrsv.getTuner());\r
                        }\r
                        else if ( jCBXPanel_encoder.getItemCount() > 0 ) {\r
                                // 裏番組チェックとかやるよ\r
@@ -1245,25 +701,26 @@ abstract class AbsReserveDialog extends JDialog implements HDDRecorderListener {
                                catch ( NumberFormatException e) {\r
                                        System.err.println(ERRID+"時刻の指定が数値ではありません");\r
                                }\r
+                               \r
                                String enc = getEmptyEncorder(myrec, vals.hide_tvd.center, vals.hide_tvd.accurateDate, starttm, endtm, vrate);\r
                                \r
                                if ( myrsv != null ) {\r
                                        // 類似予約最優先\r
-                                       jCBXPanel_encoder.setSelectedItem(myrsv.getTuner());\r
+                                       jPane_recsetting.setEncoder(myrsv.getTuner());\r
                                }\r
                                else if ( myrec.isAutoEncSelectEnabled() && ! vals.hide_atreservedlist ) {\r
                                        // 番組情報に近い予約を探してエンコーダを絞り込む\r
-                                       jCBXPanel_encoder.setSelectedItem(enc);\r
+                                       jPane_recsetting.setEncoder(enc);\r
                                        showUraList(myrec.Myself());\r
                                }\r
                                else if ( jCBXPanel_encoder.getItemCount() > 0 ) {\r
                                        // 類似予約や自動選択がない場合は極力もとのエンコーダを選択したい\r
                                        if ( myenc != null ) {\r
-                                               jCBXPanel_encoder.setSelectedItem(myenc);\r
+                                               jPane_recsetting.setEncoder(myenc);\r
                                                myenc = (String) jCBXPanel_encoder.getSelectedItem();\r
                                        }\r
                                        if ( myenc == null ) {\r
-                                               jCBXPanel_encoder.setSelectedIndex(0);\r
+                                               jPane_recsetting.setEncoder(null);\r
                                        }\r
                                        showUraList(myrec.Myself());\r
                                }\r
@@ -1285,45 +742,14 @@ abstract class AbsReserveDialog extends JDialog implements HDDRecorderListener {
                        jComboBox_date.setSelectedIndex(dateid);\r
                }\r
        }\r
-\r
+        */\r
+       /*\r
        private void setSelectedAVItems(String myrecid, ReserveList myrsv, AVs myavs) {\r
                if ( myrsv != null ) {\r
-                       selCBX(jCBXPanel_videorate, myrsv.getRec_mode());\r
-                       selCBX(jCBXPanel_folder, myrsv.getRec_folder());\r
-                       selCBX(jCBXPanel_audiorate, myrsv.getRec_audio());\r
-                       \r
-                       selCBX(jCBXPanel_device, myrsv.getRec_device());\r
-                       selCBX(jCBXPanel_bvperf, myrsv.getRec_bvperf());\r
-                       selCBX(jCBXPanel_dvdcompat, myrsv.getRec_dvdcompat());\r
-                       \r
-                       selCBX(jCBXPanel_autodel, myrsv.getRec_autodel());\r
-                       selCBX(jCBXPanel_lvoice, myrsv.getRec_lvoice());\r
-                       selCBX(jCBXPanel_aspect, myrsv.getRec_aspect());\r
-                       \r
-                       selCBX(jCBXPanel_msChapter, myrsv.getRec_mschapter());\r
-                       selCBX(jCBXPanel_mvChapter, myrsv.getRec_mvchapter());\r
-                       selCBX(jCBXPanel_xChapter, myrsv.getRec_xchapter());\r
+                       jPane_recsetting.setSelectedAVSettings(myrsv);\r
                }\r
                else if ( myavs != null ) {\r
-                       selCBX(jCBXPanel_videorate, myavs.getVideorate());\r
-                       selCBX(jCBXPanel_folder, myavs.getFolder());\r
-                       selCBX(jCBXPanel_audiorate, myavs.getAudiorate());\r
-                       \r
-                       selCBX(jCBXPanel_device, myavs.getDevice());\r
-                       selCBX(jCBXPanel_bvperf, myavs.getBvperf());\r
-                       selCBX(jCBXPanel_dvdcompat, myavs.getDVDCompat());\r
-                       \r
-                       selCBX(jCBXPanel_autodel, myavs.getAutodel());\r
-                       selCBX(jCBXPanel_lvoice, myavs.getLvoice());\r
-                       selCBX(jCBXPanel_aspect, myavs.getAspect());\r
-                       \r
-                       selCBX(jCBXPanel_msChapter, myavs.getMsChapter());\r
-                       selCBX(jCBXPanel_mvChapter, myavs.getMvChapter());\r
-                       selCBX(jCBXPanel_xChapter, myavs.getXChapter());\r
-                       \r
-                       {\r
-                               jCBXPanel_pursues.setSelectedItem(myavs.getPursues()?ITEM_YES:ITEM_NO);\r
-                       }\r
+                       jPane_recsetting.setSelectedAVSettings(myavs);\r
                }\r
                else {\r
                        // 特殊アイテム\r
@@ -1332,11 +758,13 @@ abstract class AbsReserveDialog extends JDialog implements HDDRecorderListener {
                        }\r
                }\r
        }\r
+       */\r
        \r
        /**\r
         *  <P>指定したレコーダによってフォルダを変える\r
         *  <P>うーん、folderを他の用途に転用してるけど問題おきないかな?\r
         */\r
+       /*\r
        private void setSelectedFolder() {\r
 \r
                // タイトルに連動\r
@@ -1387,65 +815,17 @@ abstract class AbsReserveDialog extends JDialog implements HDDRecorderListener {
                        jCBXPanel_folder.setSelectedIndex(defaultFolderIdx);\r
                }\r
        }\r
-       \r
-       private void setLabels(HDDRecorder recorder) {\r
-               String val;\r
-               \r
-               val = recorder.getLabel_Videorate();\r
-               jCBXPanel_videorate.setText((val!=null)?(val):("画質"));\r
-               val = recorder.getLabel_Audiorate();\r
-               jCBXPanel_audiorate.setText((val!=null)?(val):("音質"));\r
-               val = recorder.getLabel_Folder();\r
-               jCBXPanel_folder.setText((val!=null)?(val):("記録先フォルダ"));\r
-               val = recorder.getLabel_Device();\r
-               jCBXPanel_device.setText((val!=null)?(val):("記録先デバイス"));\r
-               val = recorder.getLabel_DVDCompat();\r
-               jCBXPanel_dvdcompat.setText((val!=null)?(val):("BD/DVD互換モード"));\r
-               val = recorder.getLabel_XChapter();\r
-               jCBXPanel_xChapter.setText((val!=null)?(val):("無音部分チャプタ分割"));\r
-               val = recorder.getLabel_MsChapter();\r
-               jCBXPanel_msChapter.setText((val!=null)?(val):("マジックチャプタ(シーン)"));\r
-               val = recorder.getLabel_MvChapter();\r
-               jCBXPanel_mvChapter.setText((val!=null)?(val):("マジックチャプタ(本編)"));\r
-               val = recorder.getLabel_Aspect();\r
-               jCBXPanel_aspect.setText((val!=null)?(val):("録画のりしろ"));\r
-               val = recorder.getLabel_BVperf();\r
-               jCBXPanel_bvperf.setText((val!=null)?(val):("録画優先度"));\r
-               val = recorder.getLabel_LVoice();\r
-               jCBXPanel_lvoice.setText((val!=null)?(val):("ライン音声選択"));\r
-               val = recorder.getLabel_Autodel();\r
-               jCBXPanel_autodel.setText((val!=null)?(val):("自動削除"));\r
-       }\r
-       \r
+       */\r
 \r
        /*******************************************************************************\r
         * 共通部品的な\r
         ******************************************************************************/\r
        \r
        /**\r
-        * コンボボックスのアイテムのリフレッシュ\r
-        */\r
-       private void refCBX(JComboBoxPanel combo, ArrayList<TextValueSet> tvs) {\r
-               combo.removeAllItems();\r
-               for ( TextValueSet t : tvs ) {\r
-                       combo.addItem(t.getText());\r
-                       if (t.getDefval()) combo.setSelectedIndex(combo.getItemCount()-1);      // デフォルト値があるならば\r
-               }\r
-               \r
-               combo.setEnabled( combo.getItemCount() > 0 );\r
-       }\r
-       \r
-       /**\r
-        * コンボボックスのアイテム選択\r
-        */\r
-       private void selCBX(JComboBoxPanel combo, String selected) {\r
-               if ( selected != null ) combo.setSelectedItem(selected);\r
-       }\r
-\r
-       /**\r
         * コンボボックス系のリスナーの設定/解除\r
         */\r
        private void setEnabledSelectionListeners(boolean b) {\r
+               /*\r
                // 重複呼び出しがこわいので一回全部削除してしまう\r
                jCBXPanel_encoder.removeItemListener(il_encoderChanged);\r
                jCBXPanel_videorate.removeItemListener(il_videorateChanged);\r
@@ -1460,561 +840,109 @@ abstract class AbsReserveDialog extends JDialog implements HDDRecorderListener {
                        jCBXPanel_genre.addItemListener(il_genreChanged);\r
                        jtbl_likersv.addMouseListener(ml_likelistSelected);\r
                }\r
+               */\r
        }\r
        \r
        private void removeAllSelectionItems() {\r
+               /*\r
                jCBXPanel_encoder.removeAllItems();\r
                jCBXPanel_videorate.removeAllItems();\r
                jCBXPanel_recorder.removeAllItems();\r
                jCBXPanel_genre.removeAllItems();\r
                //likersvtable.removeAllItems();\r
+                */\r
        }\r
        \r
        \r
+       \r
        /*******************************************************************************\r
         * ネットから番組IDを取得する\r
         ******************************************************************************/\r
        \r
        /**\r
-        * ã\82¸ã\83£ã\83³ã\83«å\88¥ï¼¡ï¼¶è¨­å®\9aã\81®å\8f\96å¾\97\r
+        * ã\83\80ã\82¤ã\82¢ã\83­ã\82°ã\82ªã\83¼ã\83\97ã\83³æ\99\82ã\81®ç\95ªçµ\84IDå\8f\96å¾\97å\87¦ç\90\86\r
         */\r
-       private AVs getSelectedAVs(ProgGenre key_genre, String key_webChName, String recId) {\r
+       private String getEventIdOnOpen(ProgDetailList tvd) {\r
                \r
-               AVs myavs = new AVs();\r
+               if (debug) System.err.println(DBGID+"ダイアログ表示時の自動番組ID取得 id=\""+tvd.progid+"\"");\r
                \r
-               String selected_key = null;\r
-               AVSetting xavs = null;\r
-               if ( env.getEnableCHAVsetting() ) {\r
-                       selected_key = key_webChName;\r
-                       xavs = chavs;\r
+               if ( ContentIdEDCB.isValid(tvd.progid) ) {\r
+                       if (debug) System.err.println(DBGID+"番組ID取得済み");\r
+                       return tvd.progid;\r
                }\r
-               else {\r
-                       selected_key = key_genre.toString();\r
-                       xavs = avs;\r
+               if ( ! env.getAutoEventIdComplete() ) {\r
+                       if (debug) System.err.println(DBGID+"番組ID自動取得OFF");\r
+                       return tvd.progid;      // 有効な値かもしれないし、nullかもしれない\r
                }\r
                \r
-               jButton_load.setEnabled(true);\r
-               myavs = xavs.get(recId, selected_key);\r
-               if (myavs == null) {                    \r
-                       jButton_load.setEnabled(false);\r
-                       \r
-                       // デフォルトの設定があれば再チャレンジ!\r
-                       myavs = xavs.get(recId, null);\r
-                       if ( myavs != null ) {\r
-                               selected_key = "デフォルト";\r
-                       }\r
+               // キャッシュに情報を持っていないか探す\r
+               String content_id = getContentId(tvd, false);\r
+               if ( content_id != null ) {\r
+                       if (debug) System.err.println(DBGID+"番組IDキャッシュ有効");\r
+                       return content_id;\r
                }\r
+               \r
+               // ネットに探しに行く\r
+               return doGetEventId();\r
+       }\r
        \r
-               if ( myavs != null ) {\r
-                       MWin.appendMessage(MSGID+"画質・音質を自動設定します: "+recId+" & "+selected_key);\r
+\r
+       /*******************************************************************************\r
+        * 自動エンコーダ選択と裏番組抽出\r
+        ******************************************************************************/\r
+\r
+       private void showUrabanList(ArrayList<ReserveList> urabanlist) {\r
+               if ( urabanlist == null ) {\r
+                       return;\r
+               }\r
+               String MID = MSGID+"[裏番組チェック] ";\r
+               if ( urabanlist.size() > 0 ) {\r
+                       for ( ReserveList ura : urabanlist ) {\r
+                               MWin.appendMessage(String.format("%s裏番組あり: %s:%s-%s:%s, %-10s, %-12s, %s", MID, ura.getAhh(), ura.getAmm(), ura.getZhh(), ura.getZmm(), ura.getTuner(), ura.getCh_name(), ura.getTitle()));\r
+                       }\r
                }\r
                else {\r
-                       MWin.appendMessage(MSGID+"画質・音質の自動設定候補がありません: "+recId+" & "+selected_key);\r
+                       // 裏番組がない場合に分かりにくかったので追加\r
+                       MWin.appendMessage(MID+"裏番組はありません");\r
                }\r
-               \r
-               return myavs;\r
        }\r
        \r
        \r
        /*******************************************************************************\r
-        * ã\83\8dã\83\83ã\83\88ã\81\8bã\82\89ç\95ªçµ\84IDã\82\92å\8f\96å¾\97ã\81\99ã\82\8b\r
+        * ã\82¨ã\83³ã\82³ã\83¼ã\83\80ã\82³ã\83³ã\83\9cã\83\9cã\83\83ã\82¯ã\82¹ã\81®ã\83ªã\83\95ã\83¬ã\83\83ã\82·ã\83¥\r
         ******************************************************************************/\r
        \r
-       /**\r
-        * ダイアログオープン時の番組ID取得処理\r
+       /*\r
+        * 項目連動のためのメソッド群\r
         */\r
-       private void getEventIdOnOpen(final ProgDetailList tvd) {\r
-               \r
-               if (debug) System.err.println(DBGID+vals.hide_content_id+" "+ContentIdEDCB.isValid(vals.hide_content_id)+" "+vals.hide_content_id.length());\r
-               \r
-               if ( ContentIdEDCB.isValid(vals.hide_content_id) || ! env.getAutoEventIdComplete() ) {\r
-                       return; // すでに番組ID取得ずみか、自動取得がOFFか\r
-               }\r
-                       \r
-               Integer evid = null;\r
-               if ( ContentIdDIMORA.isValid(vals.hide_content_id) ) {\r
-                       ContentIdDIMORA.decodeContentId(vals.hide_content_id);\r
-                       String chid = ContentIdDIMORA.getChId();\r
-                       evid = doGetEventIdById(chid, false);\r
-               }\r
-               else {\r
-                       evid = doGetEventIdByName(tvd.center, false);\r
-               }\r
-               if ( evid != null ) {\r
-                       // on cache\r
-                       tvd.progid = vals.hide_content_id;\r
-                       tvd.setContentIdStr();\r
-               }\r
-               else {\r
-                       // online\r
-                       StWin.clear();\r
-                       \r
-                       new SwingBackgroundWorker(false) {\r
-                               @Override\r
-                               protected Object doWorks() throws Exception {\r
-                                       StWin.appendMessage(MSGID+"番組IDを取得します");\r
-                                       \r
-                                       // 番組IDを探したい\r
-                                       Integer evid = null;\r
-                                       if ( ContentIdDIMORA.isValid(vals.hide_content_id) ) {\r
-                                               ContentIdDIMORA.decodeContentId(vals.hide_content_id);\r
-                                               String chid = ContentIdDIMORA.getChId();\r
-                                               evid = doGetEventIdById(chid, true);\r
-                                       }\r
-                                       else {\r
-                                               evid = doGetEventIdByName(tvd.center, true);\r
-                                       }\r
-                                       if ( evid != null ) {\r
-                                               tvd.progid = vals.hide_content_id;\r
-                                               tvd.setContentIdStr();\r
-                                       }\r
-                                       return null;\r
-                               }\r
-                               @Override\r
-                               protected void doFinally() {\r
-                                       StWin.setVisible(false);\r
-                               }\r
-                       }.execute();\r
-                       \r
-                       CommonSwingUtils.setLocationCenter(parent, (Component) StWin);\r
-                       StWin.setVisible(true);\r
-               }\r
-       }\r
 \r
+       \r
        /**\r
-        * ç\95ªçµ\84表ã\81«å­\98å\9c¨ã\81\99ã\82\8bæ\94¾é\80\81å±\80IDã\81§\r
+        * ç\94»è³ªã\81«é\80£å\8b\95ã\81\97ã\81¦ã\82¨ã\83³ã\82³ã\83¼ã\83\80ã\82\92å¤\89ã\81\88ã\82\8bï¼\88RDç³»ï¼\89\r
         */\r
-       private Integer doGetEventIdById(String chid, boolean force) {\r
-               \r
-               Integer evid = geteventid.getEvId(chid,vals.hide_startdatetime, force);\r
-               \r
-               if ( force && evid == null ) {\r
-                       MWin.appendError(ERRID+"番組ID取得でエラーが発生しました: "+chid+", "+vals.hide_startdatetime);\r
-                       ringBeep();\r
-                       return null;    // 一発死に\r
-               }\r
-               else if ( ! force && evid == null ) {\r
-                       System.out.println(MSGID+"キャッシュにヒットしませんでした: "+chid+", "+vals.hide_startdatetime);\r
-                       return null;\r
+       /*\r
+       private void setEncoderComboBoxByVrate(String enc1, String enc2) {\r
+               int index = -1;\r
+               for (int i=0; i<jCBXPanel_encoder.getItemCount(); i++) {\r
+                       if (enc1 != null && jCBXPanel_encoder.getItemAt(i).equals(enc1)) {\r
+                               index = i;\r
+                               break;\r
+                       }\r
+                       if (enc2 != null && jCBXPanel_encoder.getItemAt(i).equals(enc2)) {\r
+                               index = i;\r
+                               break;\r
+                       }\r
                }\r
-               else if ( evid == -1 ) {\r
-                       MWin.appendError(ERRID+"番組IDが取得できませんでした: "+chid+", "+vals.hide_startdatetime);\r
-                       return null;\r
-               }\r
-               \r
-               ContentIdDIMORA.decodeContentId(vals.hide_content_id);\r
-               vals.hide_content_id = ContentIdDIMORA.getContentId(evid);\r
-\r
-               MWin.appendMessage(MSGID+"番組IDを取得しました(byId): "+vals.hide_content_id);\r
-               setGetEventIdButton(vals.hide_content_id, true);\r
-               \r
-               return evid;\r
-       }\r
-       \r
-       /**\r
-        * レコーダに登録された放送局IDで\r
-        */\r
-       private Integer doGetEventIdByName(String centername, boolean force) {\r
-               \r
-               String chid = null;\r
-               String chidEDCB = null;\r
-               String chidREGZA = null;\r
-               \r
-               Integer evid = null;\r
-               \r
-               // 登録済みのレコーダプラグインを全部チェックしてみる\r
-               for ( HDDRecorder rec : recorders ) {\r
-                       if ( rec.isBackgroundOnly() ) {\r
-                               continue;\r
-                       }\r
-\r
-                       chidEDCB = chidREGZA = chid = null;\r
-                       Integer tmpEvid = null;\r
-                       \r
-                       String chcode = rec.getChCode().getCH_WEB2CODE(centername);\r
-                       if ( chcode == null ) {\r
-                               System.err.println(ERRID+"「Web番組表の放送局名」を「放送局コード」に変換できません: "+rec.getRecorderId()+" "+centername);\r
-                               continue;\r
-                       }\r
-                       \r
-                       chidEDCB = chid = ContentIdEDCB.getChId(chcode);\r
-                       if ( chid == null ) {\r
-                               chidREGZA = chid = ContentIdREGZA.getChId(chcode);\r
-                               if ( chid == null ) {\r
-                                       System.err.println(ERRID+"番組IDの取得に未対応のレコーダです: "+rec.getRecorderId());\r
-                                       continue;\r
-                               }\r
-                       }\r
-                       \r
-                       if (debug) System.out.println(MSGID+"番組IDを取得します: "+rec.getRecorderId());\r
-                       \r
-                       tmpEvid = geteventid.getEvId(chid,vals.hide_startdatetime, force);\r
-                       \r
-                       if (evid == null) evid = tmpEvid;\r
-                       \r
-                       if ( force && tmpEvid == null ) {\r
-                               MWin.appendError(ERRID+"番組ID取得でエラーが発生しました: "+chid+", "+vals.hide_startdatetime);\r
-                               ringBeep();\r
-                               return null;    // 一発死に\r
-                       }\r
-                       else if ( ! force && tmpEvid == null ) {\r
-                               System.out.println(MSGID+"キャッシュにヒットしませんでした: "+chid+", "+vals.hide_startdatetime);\r
-                               return null;\r
-                       }\r
-                       else if ( tmpEvid == -1 ) {\r
-                               System.err.println(ERRID+"番組IDが取得できませんでした: "+chid+", "+vals.hide_startdatetime);\r
-                               continue;\r
-                       }\r
-                       \r
-                       break;\r
-               }\r
-               \r
-               if ( evid == null ) {\r
-                       MWin.appendError(ERRID+"【致命的エラー】放送局IDを持つレコーダプラグインが存在しません");\r
-                       ringBeep();\r
-                       return null;\r
-               }\r
-               else if ( evid == -1 ) {\r
-                       MWin.appendError(ERRID+"【警告】番組IDの取得に失敗しました。開始時刻の移動や、まだ番組表サイトに情報が用意されていない場合などが考えられます。");\r
-                       ringBeep();\r
-                       return null;\r
-               }\r
-               \r
-               if ( chidREGZA != null ) {\r
-                       vals.hide_content_id = ContentIdREGZA.getContentId(chidREGZA, evid);\r
-               }\r
-               else {\r
-                       vals.hide_content_id = ContentIdEDCB.getContentId(chidEDCB, evid);\r
-               }               \r
-               \r
-               MWin.appendMessage(MSGID+"番組IDを取得しました(byName): "+vals.hide_content_id);\r
-               setGetEventIdButton(vals.hide_content_id, true);\r
-               \r
-               return evid;\r
-       }\r
-\r
-       /**\r
-        * @param enabled 番組IDの取得ができないシチュエーション(予約一覧から開くとか)では取得ボタンをfalseに。\r
-        */\r
-       private boolean setGetEventIdButton(String cId, boolean enabled) {\r
-               \r
-               Integer evid = null;\r
-               if ( ContentIdEDCB.decodeContentId(cId) ) {\r
-                       evid = ContentIdEDCB.getEvId();\r
-               }\r
-               else if ( ContentIdREGZA.decodeContentId(cId) && ContentIdREGZA.getEvId() != 0x0000 ) {\r
-                       evid = ContentIdREGZA.getEvId();\r
-               }\r
-               else if ( ContentIdDIMORA.decodeContentId(cId) && ContentIdDIMORA.getEvId() != 0x0000 ) {\r
-                       evid = ContentIdDIMORA.getEvId();\r
-               }\r
-               if ( evid == null ) {\r
-                       jButton_getEventId.setText(ITEM_EVIDNEEDED);\r
-                       if (enabled) {\r
-                               jButton_getEventId.setForeground(Color.BLUE);\r
-                               jButton_getEventId.setEnabled(true);\r
-                       }\r
-                       else {\r
-                               jButton_getEventId.setForeground(Color.GRAY);\r
-                               jButton_getEventId.setEnabled(false);\r
-                       }\r
-                       // 番組IDが取得できるまではdisable\r
-                       return false;\r
-               }\r
-               else {\r
-                       jButton_getEventId.setText(String.format("番組ID:%04X",evid));\r
-                       jButton_getEventId.setForeground(Color.GRAY);\r
-                       jButton_getEventId.setEnabled(false);\r
-                       // 番組IDが取得できるまではdisable\r
-                       return true;\r
-               }\r
-       }\r
-       \r
-\r
-       /*******************************************************************************\r
-        * 自動エンコーダ選択と裏番組抽出\r
-        ******************************************************************************/\r
-\r
-       /**\r
-        * <P>使用されていないエンコーダをリストアップする\r
-        * <P>裏番組リストも一緒に作成する\r
-        */\r
-       private String getEmptyEncorder(HDDRecorder recorder, String ch, String date, String stime, String etime, String vrate) {\r
-               // 予約の開始・終了日時を算出する\r
-               GregorianCalendar c = CommonUtils.getCalendar(date);\r
-               String start = String.format("%s %s", CommonUtils.getDate(c,false),stime);\r
-               if (stime.compareTo(etime) > 0) {\r
-                       c.add(Calendar.DATE, 1);\r
-               }\r
-               String end = String.format("%s %s", CommonUtils.getDate(c,false),etime);\r
-               \r
-               // エンコーダの一覧を作成する\r
-               ArrayList<String> encs = getFilteredEncoders(recorder, ch);\r
-               if ( encs.size() == 0 ) {\r
-                       if ( recorder.getEncoderList().size() > 0 ) {\r
-                               MWin.appendError(ERRID+"エンコーダ候補が見つからない: "+recorder.Myself());\r
-                       }\r
-                       return null;\r
-               }\r
-               \r
-               // 空きエンコーダがみつからなかった場合の選択肢\r
-               String firstenc = encs.get(0);\r
-               \r
-               // 予約リストをなめて予約済みエンコーダーをさがす\r
-               \r
-               String rsvedTuner = null;\r
-               uraban.clear();\r
-               for ( ReserveList r : recorder.getReserves() ) {\r
-                       // 実行予定のもののみ\r
-                       if (r.getExec()) {\r
-                               // 予約時間が重なるものを抽出する\r
-                               ArrayList<String> starts = new ArrayList<String>();\r
-                               ArrayList<String> ends = new ArrayList<String>();\r
-                               CommonUtils.getStartEndList(starts, ends, r);\r
-                               for (int i=0;i<starts.size(); i++) {\r
-                                       // 既に予約済みの場合\r
-                                       if (starts.get(i).equals(start) && ends.get(i).equals(end) && ch.equals(r.getCh_name())) {\r
-                                               rsvedTuner = r.getTuner();\r
-                                               continue;\r
-                                       }\r
-                                       \r
-                                       // 時間の重なる番組\r
-                                       if ( CommonUtils.isOverlap(start, end, starts.get(i), ends.get(i), env.getAdjoiningNotRepetition()) ) {\r
-                                               \r
-                                               String msg = starts.get(i)+", "+r.getTuner()+", "+r.getTitle();\r
-                                               for ( String ura : uraban ) {\r
-                                                       if ( ura.equals(msg)) {\r
-                                                               msg = "";\r
-                                                               break;\r
-                                                       }\r
-                                               }\r
-                                               if ( ! msg.equals("")) {\r
-                                                       uraban.add(msg);\r
-                                               }\r
-                                               \r
-                                               // 予約時間が重なるものはエンコーダーの一覧から削除する\r
-                                               HashMap<String,Boolean> rems = new HashMap<String,Boolean>();\r
-                                               for ( String enc : encs ) {\r
-                                                       if (enc.equals(r.getTuner())) {\r
-                                                               rems.put(enc, true);\r
-                                                               \r
-                                                               // ---- RDデジタルW録向け暫定コード ----\r
-                                                               if (enc.equals("TS1") || enc.equals("DR1")) {\r
-                                                                       // TS1が埋まっていればREは使えない\r
-                                                                       rems.put("RE", true);\r
-                                                               }\r
-                                                               else if (enc.equals("RE")) {\r
-                                                                       // REが埋まっていればTS1は使えない\r
-                                                                       rems.put("TS1", true);\r
-                                                                       rems.put("DR1", true);\r
-                                                               }\r
-                                                               // ---- RDデジタルW録向け暫定コード ----\r
-                                                               \r
-                                                               break;\r
-                                                       }\r
-                                               }\r
-                                               for ( String key : rems.keySet() ) {\r
-                                                       encs.remove(key);\r
-                                               }\r
-                                       }\r
-                               }\r
-                       }\r
-               }\r
-               if ( recorder.isAutoEncSelectEnabled() ) {\r
-                       \r
-                       // 旧RDデジ系 - ここから\r
-                       if ( vrate != null ) {\r
-                               if ( ! vrate.equals("[TS]") && ! vrate.equals("[DR]")) {\r
-                                       if ( ! encs.contains("RE") ) {\r
-                                               // 空きエンコーダはなかった\r
-                                               jLabel_encoderemptywarn.setText("空きエンコーダ不足");\r
-                                               jLabel_encoderemptywarn.setForeground(Color.RED);\r
-                                       }\r
-                                       return "RE";\r
-                               }\r
-\r
-                               encs.remove("RE");\r
-                       }\r
-                       // 旧RDデジ系 - ここまで\r
-                       \r
-                       if ( encs.size() == 0  ) {\r
-                               // 空きエンコーダはなかった\r
-                               jLabel_encoderemptywarn.setText("空きエンコーダ不足");\r
-                               jLabel_encoderemptywarn.setForeground(Color.RED);\r
-                               return firstenc;\r
-                       }\r
-                       \r
-                       jLabel_encoderemptywarn.setText("");\r
-                       if (rsvedTuner != null) {\r
-                               // 予約済みなら同じのでいいよね\r
-                               return rsvedTuner;\r
-                       }\r
-                       if ( encs.size() > 0 ) {\r
-                               // エンコーダーが残っていればそれらの先頭を返す(裏番組がない場合は除く)\r
-                               return encs.get(0);\r
-                       }\r
-               }\r
-               else {\r
-                       jLabel_encoderemptywarn.setText("空きエンコーダ検索無効");\r
-                       jLabel_encoderemptywarn.setForeground(Color.BLACK);\r
-                       return firstenc;\r
-               }\r
-               return null;\r
-       }\r
-       \r
-       ArrayList<String> uraban = new ArrayList<String>();     // 裏番組の一覧\r
-       \r
-       private void showUraList(String myself) {\r
-               if (uraban.size() > 0) {\r
-                       for (String ura : uraban) {\r
-                               String msg = MSGID+"[裏番組チェック] "+((String) jComboBox_title.getItemAt(0))+" の裏番組: "+ura;\r
-                               MWin.appendMessage(msg);\r
-                       }\r
-               }\r
-               else {\r
-                       // 裏番組がない場合に分かりにくかったので追加\r
-                       String msg = MSGID+"[裏番組チェック] "+((String) jComboBox_title.getItemAt(0))+" の裏番組はありません";\r
-                       MWin.appendMessage(msg);\r
-               }\r
-       }\r
-       \r
-       \r
-       /*******************************************************************************\r
-        * 放送波種別によって利用できるエンコーダを絞り込んでみる\r
-        ******************************************************************************/\r
-       \r
-       /**\r
-        * エンコーダを絞る\r
-        */\r
-       private ArrayList<String> getFilteredEncoders(HDDRecorder recorder, String webChName) {\r
-               \r
-               ArrayList<String> encs = new ArrayList<String>();\r
-               \r
-               if ( recorder.getEncoderList().size() == 0 ) {\r
-                       encs.add("■");\r
-                       return encs;\r
-               }\r
-               \r
-               if ( recorder.isBroadcastTypeNeeded() ) {\r
-                       \r
-                       // エンコーダーに地上波・BS/CSの区別のあるとき\r
-                       \r
-                       String code = recorder.getChCode().getCH_WEB2CODE(webChName);\r
-                       if (code != null) {\r
-                               for ( TextValueSet enc : recorder.getEncoderList() ) {\r
-                                       if ((code.startsWith(BroadcastType.TERRA.getName()+":") && enc.getText().startsWith("地上")) ||\r
-                                                       ((code.startsWith(BroadcastType.BS.getName()+":")||code.startsWith(BroadcastType.CS.getName()+":")) && enc.getText().startsWith("BS")) ||\r
-                                                       (code.startsWith(BroadcastType.CAPTURE.getName()+":") && enc.getText().startsWith("キャプチャ"))) {\r
-                                               encs.add(enc.getText());\r
-                                       }\r
-                               }\r
-                       }\r
-                       if ( encs.size() > 0 ) {\r
-                               return encs;\r
-                       }\r
-               }\r
-\r
-               // エンコーダーに地上波・BS/CSの区別のないとき、フィルタ結果が0件のとき\r
-               \r
-               for ( TextValueSet enc : recorder.getEncoderList() ) {\r
-                       encs.add(enc.getText());\r
-               }\r
-               \r
-               return encs;\r
-       }\r
-       \r
-       \r
-       /**\r
-        * 当初はRD専用だったのですが\r
-        */\r
-       \r
-       private boolean isRD( String myrecid ) {\r
-               return ( myrecid.startsWith("RD-") || myrecid.startsWith("VARDIA RD-") || myrecid.startsWith("REGZA RD-") || myrecid.startsWith("REGZA DBR-Z") ) ;\r
-       }\r
-       \r
-       private boolean isVARDIA( String myrecid ) {\r
-               return ( myrecid.startsWith("VARDIA RD-") || myrecid.startsWith("REGZA RD-") ) ;\r
-       }\r
-       \r
-       \r
-       /*******************************************************************************\r
-        * ここから下は古いコード\r
-        ******************************************************************************/\r
-\r
-       \r
-       \r
-       \r
-       \r
-       /*******************************************************************************\r
-        * エンコーダコンボボックスのリフレッシュ\r
-        ******************************************************************************/\r
-       \r
-       /**\r
-        * コンボボックスの内容をリフレッシュする(日付専用)\r
-        */\r
-       private void refreshComboBox_date(int updown) {\r
-               GregorianCalendar cal = CommonUtils.getCalendar((String) jComboBox_date.getItemAt(0));\r
-               if ( cal == null ) {\r
-                       return;\r
-               }\r
-               cal.add(Calendar.DAY_OF_MONTH, updown);\r
-               String date = CommonUtils.getDate(cal);\r
-               String ptrn = String.format("毎%s曜日",date.substring(11,12));\r
-               Integer idx = jComboBox_date.getSelectedIndex();\r
-               jComboBox_date.removeItemAt(0);\r
-               jComboBox_date.insertItemAt(date, 0);\r
-               jComboBox_date.removeItemAt(1);\r
-               jComboBox_date.insertItemAt(ptrn, 1);\r
-               jComboBox_date.setSelectedIndex(idx);\r
-       }\r
-\r
-       /*\r
-        * 項目連動のためのメソッド群\r
-        */\r
-\r
-       /**\r
-        * エンコーダに連動して画質を変える(RD系)\r
-        */\r
-       private void setVrateComboBoxByEncoder(String vrate1, String vrate2) {\r
-               int index = -1;\r
-               for (int i=0; i<jCBXPanel_videorate.getItemCount(); i++) {\r
-                       if (vrate1 != null && ((String)jCBXPanel_videorate.getItemAt(i)).startsWith(vrate1)) {\r
-                               index = i;\r
-                               break;\r
-                       }\r
-                       if (vrate2 != null && ((String)jCBXPanel_videorate.getItemAt(i)).startsWith(vrate2)) {\r
-                               index = i;\r
-                               break;\r
-                       }\r
-               }\r
-               if (index >= 0) {\r
-                       jCBXPanel_videorate.setSelectedIndex(index);\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * 画質に連動してエンコーダを変える(RD系)\r
-        */\r
-       private void setEncoderComboBoxByVrate(String enc1, String enc2) {\r
-               int index = -1;\r
-               for (int i=0; i<jCBXPanel_encoder.getItemCount(); i++) {\r
-                       if (enc1 != null && jCBXPanel_encoder.getItemAt(i).equals(enc1)) {\r
-                               index = i;\r
-                               break;\r
-                       }\r
-                       if (enc2 != null && jCBXPanel_encoder.getItemAt(i).equals(enc2)) {\r
-                               index = i;\r
-                               break;\r
-                       }\r
-               }\r
-               if (index >= 0) {\r
-                       jCBXPanel_encoder.setSelectedIndex(index);\r
+               if (index >= 0) {\r
+                       jCBXPanel_encoder.setSelectedIndex(index);\r
                }\r
        }\r
+       */\r
        \r
        /**\r
         * 自分のかツールバーのかわかりにくいので名前にMyって付け足した\r
         */\r
+       /*\r
        private HDDRecorder getMySelectedRecorder() {\r
                String myself = (String) jCBXPanel_recorder.getSelectedItem();\r
                if ( myself == null ) {\r
@@ -2026,7 +954,9 @@ abstract class AbsReserveDialog extends JDialog implements HDDRecorderListener {
                }\r
                return recs.get(0);\r
        }\r
+       */\r
        \r
+       /*\r
        private ProgGenre getMySelectedGenre() {\r
                String mygenre = (String) jCBXPanel_genre.getSelectedItem();\r
                if ( mygenre == null ) {\r
@@ -2034,40 +964,7 @@ abstract class AbsReserveDialog extends JDialog implements HDDRecorderListener {
                }\r
                return ProgGenre.get(mygenre);\r
        }\r
-       \r
-       /*******************************************************************************\r
-        * ハンドラ―メソッド\r
-        ******************************************************************************/\r
-       \r
-       /**\r
-        * ツールバーでレコーダの選択イベントが発生\r
-        */\r
-       @Override\r
-       public void valueChanged(HDDRecorderSelectionEvent e) {\r
-               if (debug) System.out.println(DBGID+"recorder selection rised");\r
-               \r
-               // 選択中のレコーダ情報を保存する\r
-               src_recsel = (HDDRecorderSelectable) e.getSource();\r
-       }\r
-       \r
-       private String getSelectedRecorderId() {\r
-               return ( src_recsel!=null ? src_recsel.getSelectedId() : null );\r
-       }\r
-       \r
-       private HDDRecorderList getSelectedRecorderList() {\r
-               return ( src_recsel!=null ? src_recsel.getSelectedList() : null );\r
-       }\r
-       \r
-       private HDDRecorderSelectable src_recsel;\r
-       \r
-       \r
-       /**\r
-        * レコーダ情報の変更イベントが発生\r
-        */\r
-       @Override\r
-       public void stateChanged(HDDRecorderChangeEvent e) {\r
-       }\r
-       \r
+       */\r
        \r
        /*******************************************************************************\r
         * リスナー\r
@@ -2091,7 +988,7 @@ abstract class AbsReserveDialog extends JDialog implements HDDRecorderListener {
                public void windowOpened(WindowEvent e) {\r
                        if (debug) System.out.println(DBGID+"wl_opened/windowOpened");\r
                        // 開いたときは、タイトル入力エリアにフォーカスを移します\r
-                       jComboBox_title.requestFocusInWindow();\r
+//                     jComboBox_title.requestFocusInWindow();\r
                }\r
        };\r
        \r
@@ -2118,37 +1015,9 @@ abstract class AbsReserveDialog extends JDialog implements HDDRecorderListener {
         * 項目連動のためのリスナー群\r
         */\r
        \r
-       /**\r
-        *  レコーダー/ジャンル/類似予約の変更にAV設定他が連動\r
-        */\r
-       private final ItemListener il_recorderChanged = new ItemListener() {\r
-               @Override\r
-               public void itemStateChanged(ItemEvent e) {\r
-                       selectionChangedComm(e.getStateChange(), ChangedSelector.RECORDER);\r
-               }\r
-       };\r
-       \r
-       private final ItemListener il_genreChanged = new ItemListener() {\r
-               @Override\r
-               public void itemStateChanged(ItemEvent e) {\r
-                       selectionChangedComm(e.getStateChange(), ChangedSelector.GENRE);\r
-               }\r
-       };\r
-\r
-       private final MouseListener ml_likelistSelected = new MouseAdapter() {\r
-               @Override\r
-               public void mouseClicked(MouseEvent e) {\r
-                       if ( ! jtbl_likersv.isEnabled() ) {\r
-                               return;\r
-                       }\r
-                       if (SwingUtilities.isLeftMouseButton(e)) {\r
-                               selectionChangedComm(ItemEvent.SELECTED, ChangedSelector.LIKELIST);\r
-                       }\r
-               }\r
-       };\r
        \r
        private void selectionChangedComm(int stateChange, ChangedSelector changed) {\r
-               \r
+               /*\r
                if ( stateChange != ItemEvent.SELECTED ) {\r
                        return;\r
                }\r
@@ -2265,60 +1134,21 @@ abstract class AbsReserveDialog extends JDialog implements HDDRecorderListener {
                setLabels(myrec);\r
                \r
                setEnabledSelectionListeners(true);\r
+               */\r
        }\r
        \r
        /**\r
-        *  エンコーダに画質が連動\r
-        */\r
-       private final ItemListener il_encoderChanged = new ItemListener() {\r
-               @Override\r
-               public void itemStateChanged(ItemEvent e) {\r
-                       if (e.getStateChange() != ItemEvent.SELECTED) {\r
-                               return;\r
-                       }\r
-\r
-                       String myself = (String) jCBXPanel_recorder.getSelectedItem();\r
-                       if ( myself == null ) {\r
-                               return;\r
-                       }\r
-                       String myrecId = recorders.findInstance(myself).get(0).getRecorderId();\r
-                       if ( ! isVARDIA(myrecId) ) {\r
-                               return;\r
-                       }\r
-                       \r
-                       String encoder = (String) jCBXPanel_encoder.getSelectedItem();\r
-                       if ( encoder == null ) {\r
-                               return;\r
-                       }\r
-\r
-                       setEnabledSelectionListeners(false);\r
-\r
-                       // TS1/2では画質に[TS]、DR1/2では[DR]を選ぶ\r
-                       if (encoder.startsWith("TS")) {\r
-                               setVrateComboBoxByEncoder("[TS]",null);\r
-                       }\r
-                       else if (encoder.startsWith("DR")) {\r
-                               setVrateComboBoxByEncoder("[DR]",null);\r
-                       }\r
-                       else if (encoder.startsWith("RE")) {\r
-                               setVrateComboBoxByEncoder("[TSE] ","[AVC] ");\r
-                       }\r
-               \r
-                       setEnabledSelectionListeners(true);\r
-               }\r
-       };\r
-       \r
-       /**\r
         *  画質にエンコーダと音質が連動\r
         */\r
        private final ItemListener il_videorateChanged = new ItemListener() {\r
                @Override\r
                public void itemStateChanged(ItemEvent e) {\r
+                       /*\r
                        if (e.getStateChange() != ItemEvent.SELECTED) {\r
                                return;\r
                        }\r
 \r
-                       String myself = (String) jCBXPanel_recorder.getSelectedItem();\r
+                       String myself = jPane_recsetting.getSelectedRecorder();\r
                        if ( myself == null ) {\r
                                return;\r
                        }\r
@@ -2327,7 +1157,7 @@ abstract class AbsReserveDialog extends JDialog implements HDDRecorderListener {
                                return;\r
                        }\r
                        \r
-                       String vrate = (String)jCBXPanel_videorate.getSelectedItem(); \r
+                       String vrate = jPane_recsetting.getSelectedVideorate(); \r
                        if (vrate == null) {\r
                                return;\r
                        }\r
@@ -2356,122 +1186,7 @@ abstract class AbsReserveDialog extends JDialog implements HDDRecorderListener {
                        }\r
                        \r
                        setEnabledSelectionListeners(true);\r
-               }\r
-       };\r
-       \r
-       /**\r
-        * 延長警告のON/OFF\r
-        */\r
-       private final ActionListener al_spoexClicked = new ActionListener() {\r
-               public void actionPerformed(ActionEvent e) {\r
-                       if (jCheckBox_spoex_extend.isSelected() == true) {\r
-                               int spoexLength = Integer.valueOf(env.getSpoexLength());\r
-                               if (spoexLength>0) {\r
-                                       int zhh = Integer.valueOf(jTextField_zhh.getText());\r
-                                       int zmm = Integer.valueOf(jTextField_zmm.getText());\r
-                                       \r
-                                       int z = zhh*60+zmm+spoexLength;\r
-                                       zmm = z % 60;\r
-                                       zhh = (z-zmm)/60%24;\r
-                                       \r
-                                       jTextField_zhh.setText(String.format("%02d", zhh));\r
-                                       jTextField_zmm.setText(String.format("%02d", zmm));\r
-                               }\r
-                       }\r
-                       else {\r
-                               int spoexLength = Integer.valueOf(env.getSpoexLength());\r
-                               if (spoexLength>0) {\r
-                                       int zhh = Integer.valueOf(jTextField_zhh.getText());\r
-                                       int zmm = Integer.valueOf(jTextField_zmm.getText());\r
-                                       \r
-                                       int z = zhh*60+zmm-spoexLength;\r
-                                       if (z < 0) {\r
-                                               z +=24*60;\r
-                                       }\r
-                                       zmm = z % 60;\r
-                                       zhh = (z-zmm)/60%24;\r
-                                       \r
-                                       jTextField_zhh.setText(String.format("%02d", zhh));\r
-                                       jTextField_zmm.setText(String.format("%02d", zmm));\r
-                               }\r
-                       }\r
-               }\r
-       };\r
-       \r
-       /**\r
-        * 1分短縮のON/OFF\r
-        */\r
-       private final ActionListener al_overlapClipClicked = new ActionListener() {\r
-               public void actionPerformed(ActionEvent e) {\r
-                       if (jCheckBox_OverlapDown2.isSelected() == true) {\r
-                               int zhh = Integer.valueOf(jTextField_zhh.getText());\r
-                               int zmm = Integer.valueOf(jTextField_zmm.getText());\r
-                               \r
-                               int z = zhh*60+zmm-1;\r
-                               if (z < 0) {\r
-                                       z +=24*60;\r
-                               }\r
-                               zmm = z % 60;\r
-                               zhh = (z-zmm)/60%24;\r
-                               \r
-                               jTextField_zhh.setText(String.format("%02d", zhh));\r
-                               jTextField_zmm.setText(String.format("%02d", zmm));\r
-                       }\r
-                       else {\r
-                               int zhh = Integer.valueOf(jTextField_zhh.getText());\r
-                               int zmm = Integer.valueOf(jTextField_zmm.getText());\r
-                               \r
-                               int z = zhh*60+zmm+1;\r
-                               zmm = z % 60;\r
-                               zhh = (z-zmm)/60%24;\r
-                               \r
-                               jTextField_zhh.setText(String.format("%02d", zhh));\r
-                               jTextField_zmm.setText(String.format("%02d", zmm));\r
-                       }\r
-               }\r
-       };\r
-       \r
-       /**\r
-        * ジャンル別AV設定のロード\r
-        */\r
-       private final ActionListener al_loadAction = new ActionListener() {\r
-               public void actionPerformed(ActionEvent e) {\r
-                       ProgGenre key_genre = ProgGenre.get((String) jCBXPanel_genre.getSelectedItem());\r
-                       String key_webChName = (String) jComboBox_ch.getSelectedItem();\r
-                       String recId = recorders.findInstance((String) jCBXPanel_recorder.getSelectedItem()).get(0).getRecorderId();\r
-                       setSelectedAVItems(recId, null, getSelectedAVs(key_genre, key_webChName, recId));\r
-                       MWin.appendMessage(MSGID+"画質・音質等の設定を取得しました");\r
-               }\r
-       };\r
-       \r
-       /**\r
-        * ジャンル別AV設定のセーブ\r
-        */\r
-       private final ActionListener al_saveAction = new ActionListener() {\r
-               public void actionPerformed(ActionEvent e) {\r
-                       Matcher ma = Pattern.compile("^.+?:.+?:(.+?)$").matcher((String)jCBXPanel_recorder.getSelectedItem());\r
-                       if (ma.find()) {\r
-                               if (env.getEnableCHAVsetting()) {\r
-                                       String key_webChName = (String) jComboBox_ch.getSelectedItem();\r
-                                       _save_avsettings(ma.group(1),key_webChName);\r
-                               }\r
-                               else {\r
-                                       String key_genre = (String) jCBXPanel_genre.getSelectedItem();\r
-                                       _save_avsettings(ma.group(1),key_genre);\r
-                               }\r
-                       }\r
-               }\r
-       };\r
-       \r
-       /**\r
-        * 既定AV設定のセーブ\r
-        */\r
-       private final ActionListener al_saveDefault = new ActionListener() {\r
-               public void actionPerformed(ActionEvent e) {\r
-                       Matcher ma = Pattern.compile("^.+?:.+?:(.+?)$").matcher((String)jCBXPanel_recorder.getSelectedItem());\r
-                       if (ma.find()) {\r
-                               _save_avsettings(ma.group(1),null);\r
-                       }\r
+                       */\r
                }\r
        };\r
        \r
@@ -2489,900 +1204,582 @@ abstract class AbsReserveDialog extends JDialog implements HDDRecorderListener {
                c.setRecorderId(key_recorderId);\r
                c.setGenre(key_genre);\r
                \r
-               c.setVideorate((String)jCBXPanel_videorate.getSelectedItem());\r
-               c.setAudiorate((String)jCBXPanel_audiorate.getSelectedItem());\r
-               c.setDVDCompat((String)jCBXPanel_dvdcompat.getSelectedItem());\r
-               c.setDevice((String)jCBXPanel_device.getSelectedItem());\r
-               c.setXChapter((String)jCBXPanel_xChapter.getSelectedItem());\r
-               c.setMsChapter((String)jCBXPanel_msChapter.getSelectedItem());\r
-               c.setMvChapter((String)jCBXPanel_mvChapter.getSelectedItem());\r
-               c.setAspect((String)jCBXPanel_aspect.getSelectedItem());\r
-               c.setBvperf((String)jCBXPanel_bvperf.getSelectedItem());\r
-               c.setLvoice((String)jCBXPanel_lvoice.getSelectedItem());\r
-               c.setAutodel((String)jCBXPanel_autodel.getSelectedItem());\r
-               c.setFolder((String)jCBXPanel_folder.getSelectedItem());\r
-               c.setPursues(ITEM_YES.equals((String) jCBXPanel_pursues.getSelectedItem()));\r
+               jPane_recsetting.getSelectedSetting(c);\r
                \r
                xavs.add(key_recorderId, key_genre, c);\r
                xavs.save();\r
                \r
                MWin.appendMessage(MSGID+"画質・音質等の設定を保存しました:"+key_recorderId+" & "+((key_genre!=null)?(key_genre):("デフォルト")));\r
        }\r
-\r
-       /**\r
-        * タイトルが入力されたよ\r
-        */\r
-       private final ItemListener il_titleEntered = new ItemListener() {\r
-               @Override\r
-               public void itemStateChanged(ItemEvent e) {\r
-                       if (e.getStateChange() == ItemEvent.SELECTED) {\r
-                               // キャレットを先頭へ\r
-                               ((JTextField)jComboBox_title.getEditor().getEditorComponent()).setCaretPosition(0);\r
-                       }\r
+       \r
+       \r
+       /*******************************************************************************\r
+        * コンポーネント\r
+        ******************************************************************************/\r
+       \r
+       private JPanel getJContentPane_rsv() {\r
+               if (jContentPane_rsv == null) {\r
+                       jContentPane_rsv = new JPanel();\r
+                       \r
+                       jContentPane_rsv.setLayout(new BorderLayout());\r
+                       \r
+                       jContentPane_rsv.add(getJPane_title(),BorderLayout.NORTH);\r
+                       jContentPane_rsv.add(getJPane_recsetting(),BorderLayout.CENTER);\r
+                       jContentPane_rsv.add(getJPane_likersv(),BorderLayout.SOUTH);\r
                }\r
-       };\r
+               return jContentPane_rsv;\r
+       }\r
        \r
        /**\r
-        * 番組IDを取得する\r
+        * 番組情報のエリア\r
         */\r
-       private final ActionListener al_getEventId = new ActionListener() {\r
-               @Override\r
-               public void actionPerformed(ActionEvent e) {\r
-                       \r
-                       StWin.clear();\r
-                       \r
-                       new SwingBackgroundWorker(false) {\r
-                               \r
-                               @Override\r
-                               protected Object doWorks() throws Exception {\r
-                                       TatCount tc = new TatCount();\r
-                                       StWin.appendMessage(MSGID+"番組IDを取得します");\r
-                                       Integer evid = null;\r
-                                       if ( ContentIdDIMORA.isValid(vals.hide_content_id) ) {\r
-                                               ContentIdDIMORA.decodeContentId(vals.hide_content_id);\r
-                                               String chid = ContentIdDIMORA.getChId();\r
-                                               evid = doGetEventIdById(chid, true);\r
-                                       }\r
-                                       else {\r
-                                               evid = doGetEventIdByName((String) jComboBox_ch.getSelectedItem(), true);\r
-                                       }\r
-                                       if ( evid == null ) {\r
-                                               StWin.appendError(ERRID+String.format("番組IDの取得に失敗しました。所要時間: %.2f秒",tc.end()));\r
-                                       }\r
-                                       else {\r
-                                               StWin.appendMessage(MSGID+String.format("番組IDを取得しました。所要時間: %.2f秒",tc.end()));\r
-                                               if ( vals.hide_tvd != null ) {\r
-                                                       vals.hide_tvd.progid = vals.hide_content_id;\r
-                                                       vals.hide_tvd.setContentIdStr();\r
-                                               }\r
-                                               HDDRecorderList recs = recorders.findInstance((String) jCBXPanel_recorder.getSelectedItem());\r
-                                               if ( recs.size() > 0 ) {\r
-                                                       jCBXPanel_pursues.setEnabled(recs.get(0).isPursuesEditable());\r
-                                               }\r
-                                       }\r
-                                       return null;\r
-                               }\r
-                               \r
-                               @Override\r
-                               protected void doFinally() {\r
-                                       StWin.setVisible(false);\r
-                               }\r
-                       }.execute();\r
+       private JPanel getJPane_title() {\r
+               if ( jPane_title == null ) {\r
+                       jPane_title = new TitleEditorPanel();\r
                        \r
-                       CommonSwingUtils.setLocationCenter(AbsReserveDialog.this, (Component) StWin);\r
-                       StWin.setVisible(true);\r
+                       jPane_title.setRecordExecuter(this);    // 予約実行ボタン押下時のコールバックの設定\r
                }\r
-       };\r
+               return jPane_title;\r
+       }\r
        \r
        /**\r
-        * タイトルに日付を追加する\r
+        * 録画設定のエリア\r
         */\r
-       private ActionListener al_addDate = new ActionListener() {\r
-               @Override\r
-               public void actionPerformed(ActionEvent e) {\r
-                       String date = (String) jComboBox_date.getSelectedItem();\r
-                       if ( ! date.matches("^\\d\\d\\d\\d/\\d\\d/\\d\\d.*$") ) {\r
-                               // 日付指定でなければ\r
-                               return;\r
-                       }\r
-                       date = date.substring(5,10).replaceAll("/","_");\r
-                       \r
-                       String title = (String) jComboBox_title.getSelectedItem();\r
-                       if ( title.matches("^.* \\d\\d_\\d\\d$") ) {\r
-                               // 日付更新\r
-                               title = title.substring(0,title.length()-6);\r
-                       }\r
-                       title = title + " " + date;\r
-                       if ( title.equals((String) jComboBox_title.getSelectedItem()) ) {\r
-                               // 変化なければ\r
-                               return;\r
-                       }\r
-                       \r
-                       int index = jComboBox_title.getSelectedIndex();\r
-                       jComboBox_title.insertItemAt(title,index);\r
-                       jComboBox_title.setSelectedIndex(index);\r
+       private JPanel getJPane_recsetting() {\r
+               if ( jPane_recsetting == null ) {\r
+                       jPane_recsetting = new RecSettingEditorPanel();\r
                        \r
-                       // キャレットを末尾へ\r
-                       ((JTextField)jComboBox_title.getEditor().getEditorComponent()).setCaretPosition(title.length());\r
+                       jPane_recsetting.setRecSettingSelector(this);   // アイテム選択時のコールバックの設定\r
                }\r
-       };\r
+               return jPane_recsetting;\r
+       }\r
 \r
        /**\r
-        * é\96\8bå§\8bæ\99\82å\88»ã\82\92ï¼\91å\88\86é\80²ã\82\81ã\82\8b\r
+        * é¡\9eä¼¼äº\88ç´\84ã\81®ã\82¨ã\83ªã\82¢\r
         */\r
-       private final ActionListener al_upAmm = new ActionListener() {\r
-               @Override\r
-               public void actionPerformed(ActionEvent e) {\r
-                       if ( _upmm(jTextField_ahh,jTextField_amm) ) {\r
-                               refreshComboBox_date(+1);\r
-                       }\r
+       private JScrollPane getJPane_likersv() {\r
+               if ( jPane_likersv == null ) {\r
+                       jPane_likersv = new LikeReserveEditorPanel();\r
+                       \r
+                       jPane_likersv.setLikeReserveSelector(this);     // 予約実行ボタン押下時のコールバックの設定\r
                }\r
-       };\r
+               return jPane_likersv;\r
+       }\r
+       \r
+       \r
+       /*******************************************************************************\r
+        * ハンドラ―メソッドの実装\r
+        ******************************************************************************/\r
        \r
        /**\r
-        * 開始時刻を1分戻す\r
+        * ツールバーでレコーダの選択イベントが発生\r
         */\r
-       private final ActionListener al_downAmm = new ActionListener() {\r
-               @Override\r
-               public void actionPerformed(ActionEvent e) {\r
-                       if ( _downmm(jTextField_ahh,jTextField_amm) ) {\r
-                               refreshComboBox_date(-1);\r
-                       }\r
-               }\r
-       };\r
+       @Override\r
+       public void valueChanged(HDDRecorderSelectionEvent e) {\r
+               if (debug) System.out.println(DBGID+"recorder selection rised");\r
+               \r
+               // 選択中のレコーダ情報を保存する\r
+               src_recsel = (HDDRecorderSelectable) e.getSource();\r
+       }\r
        \r
        /**\r
-        * 終了時刻を1分進め\r
+        * ツールバーの操作によって選択されたレコーダのIDを取得す\r
         */\r
-       private final ActionListener al_upZmm = new ActionListener() {\r
-               @Override\r
-               public void actionPerformed(ActionEvent e) {\r
-                       _upmm(jTextField_zhh,jTextField_zmm);\r
-               }\r
-       };\r
+       private String getSelectedRecorderId() {\r
+               return ( src_recsel!=null ? src_recsel.getSelectedId() : null );\r
+       }\r
        \r
        /**\r
-        * 終了時刻を1分戻す\r
+        * ツールバーの操作によって選択されたレコーダのプラグインインスタンスリストを取得する\r
         */\r
-       private final ActionListener al_downZmm = new ActionListener() {\r
-               @Override\r
-               public void actionPerformed(ActionEvent e) {\r
-                       _downmm(jTextField_zhh,jTextField_zmm);\r
-               }\r
-       };\r
-       \r
-       private boolean _upmm(JTextField hh, JTextField mm) {\r
-               boolean b = false;\r
-               Integer amm = Integer.valueOf(mm.getText()) + 1;\r
-               Integer ahh = amm / 60;\r
-               if (ahh > 0) {\r
-                       ahh += Integer.valueOf(hh.getText());\r
-                       ahh %= 24;\r
-                       hh.setText(String.format("%02d",ahh));\r
-                       // 日付変更線を超えた\r
-                       if (ahh == 0) {\r
-                               b = true;\r
-                       }\r
-               }\r
-               amm = amm % 60;\r
-               mm.setText(String.format("%02d",amm));\r
-               return b;\r
+       private HDDRecorderList getSelectedRecorderList() {\r
+               return ( src_recsel!=null ? src_recsel.getSelectedList() : null );\r
        }\r
        \r
-       private boolean _downmm(JTextField hh, JTextField mm) {\r
-               boolean b = false;\r
-               Integer amm = Integer.valueOf(mm.getText()) + 59;\r
-               amm %= 60;\r
-               if (amm == 59) {\r
-                       Integer ahh = Integer.valueOf(hh.getText()) + 23;\r
-                       ahh %= 24;\r
-                       hh.setText(String.format("%02d",ahh));\r
-                       // 日付変更線を超えた\r
-                       if (ahh == 23) {\r
-                               b = true;\r
-                       }\r
-               }\r
-               mm.setText(String.format("%02d",amm));\r
-               return b;\r
-       }\r
+       private HDDRecorderSelectable src_recsel;\r
        \r
-       /**\r
-        * 開始終了日時をリセットする\r
-        */\r
-       private MouseAdapter ml_resetStartEnd = new MouseAdapter() {\r
-               @Override\r
-               public void mouseClicked(MouseEvent e) {\r
-                       int n = jComboBox_date.getSelectedIndex();\r
-                       jCheckBox_spoex_extend.setSelected(vals.isExtended);\r
-                       jCheckBox_OverlapDown2.setSelected(vals.isClipped);\r
-                       jComboBox_date.removeItemAt(0);\r
-                       jComboBox_date.insertItemAt(vals.byDateIni, 0);\r
-                       jComboBox_date.removeItemAt(1);\r
-                       jComboBox_date.insertItemAt(vals.byWeeklyIni, 1);\r
-                       jComboBox_date.setSelectedIndex(n);\r
-                       jTextField_ahh.setText(vals.ahh);\r
-                       jTextField_amm.setText(vals.amm);\r
-                       jTextField_zhh.setText(vals.zhh);\r
-                       jTextField_zmm.setText(vals.zmm);\r
-               }\r
-       };\r
-\r
-       /**\r
-        * 登録実行\r
-        */\r
-       private final ActionListener al_doRecord = new ActionListener() {\r
-               @Override\r
-               public void actionPerformed(ActionEvent e) {\r
-                       doRecord();\r
-               }\r
-       };\r
-\r
-       /**\r
-        * 更新実行\r
-        */\r
-       private final ActionListener al_doUpdate = new ActionListener() {\r
-               public void actionPerformed(ActionEvent e) {\r
-                       doUpdate();\r
-               }\r
-       };\r
        \r
        /**\r
-        * ã\82­ã\83£ã\83³ã\82»ã\83«\r
+        * ã\83\84ã\83¼ã\83«ã\83\90ã\83¼ã\81§ã\83¬ã\82³ã\83¼ã\83\80æ\83\85å ±ã\81®å¤\89æ\9b´ã\82¤ã\83\99ã\83³ã\83\88ã\81\8cç\99ºç\94\9f\r
         */\r
-       private final ActionListener al_doCancel = new ActionListener() {\r
-               @Override\r
-               public void actionPerformed(ActionEvent e) {\r
-                       //setVisible(false);\r
-                       resetWhenWindowClosed();\r
-                       dispose();\r
-               }\r
-       };\r
+       @Override\r
+       public void stateChanged(HDDRecorderChangeEvent e) {\r
+               // 処理はいらんな…\r
+       }\r
+       \r
        \r
        /*******************************************************************************\r
-        * ã\82³ã\83³ã\83\9dã\83¼ã\83\8dã\83³ã\83\88\r
+        * ã\82³ã\83¼ã\83«ã\83\90ã\83\83ã\82¯ã\83¡ã\82½ã\83\83ã\83\89ã\81®å®\9fè£\85ï¼\88ç\95ªçµ\84æ\83\85å ±ï¼\89\r
         ******************************************************************************/\r
-       \r
-       private JPanel getJContentPane_rsv() {\r
-               if (jContentPane_rsv == null) {\r
-                       jContentPane_rsv = new JPanel();\r
+\r
+       /***************************************\r
+        * 予約ボタンが押された時の処理\r
+        **************************************/\r
+\r
+       /**\r
+        * 新規登録を行う\r
+        */\r
+       @Override\r
+       public void doRecord() {\r
+               \r
+               if (debug) System.out.println(DBGID+"doRecord "+vals.toString());\r
+               \r
+               // 新規処理\r
+               final ReserveList newRsv = new ReserveList();\r
+               \r
+               jPane_title.getSelectedValues(newRsv);                  // タイトル\r
+               jPane_recsetting.getSelectedValues(newRsv);             // 録画設定\r
+               \r
+               newRsv.setId(null);                                                             // PostRdEntry()中で取得するのでここはダミー\r
+               newRsv.setUpdateOnlyExec(false);                                // 新規ONLYなのでfalse固定\r
+\r
+               // 予約実行\r
+               StWin.clear();\r
+               new SwingBackgroundWorker(false) {\r
                        \r
-                       jContentPane_rsv.setLayout(new BorderLayout());\r
+                       @Override\r
+                       protected Object doWorks() throws Exception {\r
+                               \r
+                               String myself = jPane_recsetting.getSelectedRecorder();\r
+                               for ( HDDRecorder recorder : recorders.findInstance(myself) ) {\r
+                                       \r
+                                       StWin.appendMessage(MSGID+"予約を登録します:"+newRsv.getTitle());\r
+                                       \r
+                                       if ( recorder.PostRdEntry(newRsv) ) {\r
+                                               \r
+                                               MWin.appendMessage(MSGID+"正常に登録できました:"+newRsv.getTitle()+"("+newRsv.getCh_name()+")");\r
+                                               doneReserve = true;\r
+                                               \r
+                                               // カレンダーに登録する\r
+                                               if ( recorder.getUseCalendar() && newRsv.getExec() ) {\r
+                                                       \r
+                                                       for ( HDDRecorder calendar : recorders.findInstance(RecType.CALENDAR) ) {\r
+                                                               \r
+                                                               StWin.appendMessage(MSGID+"カレンダーに予約情報を登録します");\r
+                                                               \r
+                                                               if ( ! calendar.PostRdEntry(newRsv)) {\r
+                                                                       MWin.appendError(ERRID+"[カレンダー] "+calendar.getErrmsg());\r
+                                                                       ringBeep();\r
+                                                               }\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                                       else {\r
+                                               MWin.appendError(ERRID+"登録に失敗しました:"+newRsv.getTitle()+"("+newRsv.getCh_name()+")");\r
+                                       }\r
+                                       \r
+                                       if ( ! recorder.getErrmsg().equals("")) {\r
+                                               MWin.appendMessage(MSGID+"[追加情報] "+recorder.getErrmsg());\r
+                                               ringBeep();\r
+                                       }\r
+                                       \r
+                                       break;  // 一回限り\r
+                               }\r
+                               return null;\r
+                       }\r
                        \r
-                       jContentPane_rsv.add(getJPane_title(),BorderLayout.NORTH);\r
-                       jContentPane_rsv.add(getJPane_recsetting(),BorderLayout.CENTER);\r
-                       jContentPane_rsv.add(getJPane_likersv(),BorderLayout.SOUTH);\r
-               }\r
-               return jContentPane_rsv;\r
+                       @Override\r
+                       protected void doFinally() {\r
+                               //CommonUtils.milSleep(0);\r
+                               StWin.setVisible(false);\r
+                       }\r
+               }.execute();\r
+               \r
+               CommonSwingUtils.setLocationCenter(parent, (Component)StWin);\r
+               StWin.setVisible(true);\r
+               \r
+               resetWhenWindowClosed();\r
+               dispose();\r
        }\r
        \r
        /**\r
-        * 番組情報のエリア\r
+        * 更新を行う\r
         */\r
-       private JPanel getJPane_title() {\r
-               if ( jPane_title == null ) {\r
-                       jPane_title = new JPanel();\r
-                       //jPane_title.setBorder(new LineBorder(Color.BLACK, 1));\r
-                       jPane_title.setLayout(new SpringLayout());\r
-                       \r
-                       int y = SEP_HEIGHT_NALLOW;\r
-                       int x = SEP_WIDTH_NARROW;\r
-                       \r
-                       CommonSwingUtils.putComponentOn(jPane_title, getJLabel_title("予約名"), 40, PARTS_HEIGHT, x, y);\r
-                       CommonSwingUtils.putComponentOn(jPane_title, getJComboBox_title(), TITLE_WIDTH, PARTS_HEIGHT, x+SEP_WIDTH_NARROW, y+PARTS_HEIGHT);\r
-                       \r
-                       CommonSwingUtils.putComponentOn(jPane_title, getJButton_getEventId("番組ID取得"), LABEL_WIDTH, PARTS_HEIGHT, x+50, y);\r
-                       CommonSwingUtils.putComponentOn(jPane_title, getJButton_addDate("日付追加"),        100, PARTS_HEIGHT, 270, y);\r
-                       \r
-                       CommonSwingUtils.putComponentOn(jPane_title, getJLabel_ch("CH"), LABEL_WIDTH, PARTS_HEIGHT, x+TITLE_WIDTH+SEP_WIDTH, y);\r
-                       CommonSwingUtils.putComponentOn(jPane_title, getJComboBox_ch(), CHNAME_WIDTH, PARTS_HEIGHT, x+TITLE_WIDTH+SEP_WIDTH+SEP_WIDTH_NARROW, y+PARTS_HEIGHT);\r
+       @Override\r
+       public void doUpdate() {\r
+               \r
+               if (debug) System.out.println(DBGID+"doUpdate "+vals.toString());\r
+               \r
+               LikeReserveItem likersv = vals.hide_likersvlist.getSelected();\r
+               if ( likersv == null ) {\r
+                       // ==0なら更新対象の予約情報がないっつーことで処理できない\r
+                       return;\r
+               }\r
+               \r
+               // 更新処理\r
+               final ReserveList oldRsv = likersv.getRsv();\r
+               final ReserveList newRsv = oldRsv.clone();\r
+               final HDDRecorder recorder = likersv.getRec();\r
+\r
+               jPane_title.getSelectedValues(newRsv);                          // タイトル\r
+               jPane_recsetting.getSelectedValues(newRsv);                     // 録画設定\r
+               \r
+               newRsv.setId(oldRsv.getId());                                           // 更新では引き継ぐ\r
+               newRsv.setUpdateOnlyExec(vals.isUpdateOnlyExec);        // 実行ON・OFFのみかもしんない\r
 \r
-                       y += PARTS_HEIGHT*2+SEP_HEIGHT_NALLOW;\r
+               // 更新実行\r
+               StWin.clear();\r
+               new SwingBackgroundWorker(false) {\r
                        \r
-                       {\r
-                               int hmx = x;\r
-                               CommonSwingUtils.putComponentOn(jPane_title, getJLabel_date("録画日付"),    LABEL_WIDTH,    PARTS_HEIGHT,   hmx,y);\r
-                               CommonSwingUtils.putComponentOn(jPane_title, getJComboBox_date(),               DATE_WIDTH,             PARTS_HEIGHT,   hmx+=SEP_WIDTH_NARROW, y+PARTS_HEIGHT);\r
-                               \r
-                               hmx += DATE_WIDTH+SEP_WIDTH;\r
-                               CommonSwingUtils.putComponentOn(jPane_title, getJButton_aTime("開始時刻"),  75,     PARTS_HEIGHT,   hmx, y);\r
-                               CommonSwingUtils.putComponentOn(jPane_title, getJTextField_ahh(),               40,     PARTS_HEIGHT,   hmx+=SEP_WIDTH_NARROW, y+PARTS_HEIGHT);\r
-                               CommonSwingUtils.putComponentOn(jPane_title, getJLabel_asep(":"),               10,     PARTS_HEIGHT,   hmx+=40, y+PARTS_HEIGHT);\r
-                               CommonSwingUtils.putComponentOn(jPane_title, getJTextField_amm(),               40,     PARTS_HEIGHT,   hmx+=10, y+PARTS_HEIGHT);\r
-                               CommonSwingUtils.putComponentOn(jPane_title, getJButton_amm_up(),               20,     12,                             hmx+=42, y+PARTS_HEIGHT);\r
-                               CommonSwingUtils.putComponentOn(jPane_title, getJButton_amm_down(),             20,     12,                             hmx, y+PARTS_HEIGHT+13);\r
+                       @Override\r
+                       protected Object doWorks() throws Exception {\r
                                \r
-                               hmx += 20+SEP_WIDTH_NARROW;\r
-                               CommonSwingUtils.putComponentOn(jPane_title, getJButton_zTime("終了時刻"),  75,     PARTS_HEIGHT,   hmx, y);\r
-                               CommonSwingUtils.putComponentOn(jPane_title, getJTextField_zhh(),               40,     PARTS_HEIGHT,   hmx+=SEP_WIDTH_NARROW, y+PARTS_HEIGHT);\r
-                               CommonSwingUtils.putComponentOn(jPane_title, getJLabel_zsep(":"),               10,     PARTS_HEIGHT,   hmx+=40, y+PARTS_HEIGHT);\r
-                               CommonSwingUtils.putComponentOn(jPane_title, getJTextField_zmm(),               40,     PARTS_HEIGHT,   hmx+=10, y+PARTS_HEIGHT);\r
-                               CommonSwingUtils.putComponentOn(jPane_title, getJButton_zmm_up(),               20,     12,                             hmx+=42, y+PARTS_HEIGHT);\r
-                               CommonSwingUtils.putComponentOn(jPane_title, getJButton_zmm_down(),             20,     12,                             hmx, y+PARTS_HEIGHT+13);\r
-                       \r
-                               hmx += 20+SEP_WIDTH;\r
+                               StWin.appendMessage(MSGID+"予約を更新します:"+newRsv.getTitle());\r
                                \r
-                               CommonSwingUtils.putComponentOn(jPane_title, jCheckBox_Autocomplete = new JCheckBoxPanel("タイトル自動補完",LABEL_WIDTH,true),  200, PARTS_HEIGHT, hmx, y);\r
-                               CommonSwingUtils.putComponentOn(jPane_title, getJCheckBox_spoex_extend("スポーツ延長",LABEL_WIDTH,true),                                          200, PARTS_HEIGHT, hmx, y+PARTS_HEIGHT);\r
-                               CommonSwingUtils.putComponentOn(jPane_title, getJCheckBox_OverlapDown2("終了時刻1分短縮",LABEL_WIDTH,true),                                    200, PARTS_HEIGHT, hmx, y+PARTS_HEIGHT*2);\r
+                               if ( recorder.UpdateRdEntry(oldRsv, newRsv) ) {\r
+                                       \r
+                                       // 成功したよ\r
+                                       MWin.appendMessage(MSGID+"正常に更新できました:"+oldRsv.getTitle()+"("+oldRsv.getCh_name()+")");\r
+                                       doneReserve = true;\r
+                                       \r
+                                       // カレンダーを更新する\r
+                                       if ( recorder.getUseCalendar() ) {\r
+                                               for ( HDDRecorder calendar : recorders.findInstance(RecType.CALENDAR) ) {\r
+                                                       \r
+                                                       StWin.appendMessage(MSGID+"カレンダーの予約情報を更新します");\r
+                                                       \r
+                                                       if ( ! calendar.UpdateRdEntry(oldRsv, (newRsv.getExec())?(newRsv):(null))) {\r
+                                                               MWin.appendError(ERRID+"[カレンダー] "+calendar.getErrmsg());\r
+                                                               ringBeep();\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                               }\r
+                               else {\r
+                                       MWin.appendError(ERRID+"更新に失敗しました:"+oldRsv.getTitle()+"("+oldRsv.getCh_name()+")");\r
+                               }\r
                                \r
-                               jCheckBox_Autocomplete.setSelected(env.getUseAutocomplete());\r
+                               if ( ! recorder.getErrmsg().equals("")) {\r
+                                       MWin.appendMessage(MSGID+"[追加情報] "+recorder.getErrmsg());\r
+                                       ringBeep();\r
+                               }\r
+                               return null;\r
                        }\r
                        \r
-                       y += PARTS_HEIGHT*2+SEP_WIDTH_NARROW;\r
-\r
-                       CommonSwingUtils.putComponentOn(jPane_title, getJLabel_detail("番組詳細"), 100, PARTS_HEIGHT, x, y);\r
-                       CommonSwingUtils.putComponentOn(jPane_title, getJScrollPane_detail(), DETAIL_WIDTH, DETAIL_HEIGHT, x+SEP_WIDTH_NARROW, y+PARTS_HEIGHT);\r
-                       \r
-                       y += PARTS_HEIGHT;\r
-                       \r
-                       \r
-                       \r
-                       y += DETAIL_HEIGHT+SEP_HEIGHT_NALLOW;\r
-                       \r
-                       // 特殊配置\r
-                       {\r
-                               int spy = SEP_HEIGHT_NALLOW+PARTS_HEIGHT;\r
-                               x = SEP_WIDTH_NARROW+DETAIL_WIDTH+SEP_WIDTH*2;\r
-                               \r
-                               CommonSwingUtils.putComponentOn(jPane_title, new JLabel("予約"),                              BUTTON_WIDTH, PARTS_HEIGHT, x, spy);\r
-                               CommonSwingUtils.putComponentOn(jPane_title, getJButton_record("新規"),               BUTTON_WIDTH, PARTS_HEIGHT, x+SEP_WIDTH_NARROW, spy+=PARTS_HEIGHT);\r
-                               CommonSwingUtils.putComponentOn(jPane_title, getJButton_update("更新"),               BUTTON_WIDTH, PARTS_HEIGHT, x+SEP_WIDTH_NARROW, spy+=PARTS_HEIGHT);\r
-                               CommonSwingUtils.putComponentOn(jPane_title, getJButton_cancel("キャンセル"),      BUTTON_WIDTH, PARTS_HEIGHT, x+SEP_WIDTH_NARROW, spy+=PARTS_HEIGHT);\r
+                       @Override\r
+                       protected void doFinally() {\r
+                               StWin.setVisible(false);\r
                        }\r
-                       \r
-                       x+=BUTTON_WIDTH+SEP_WIDTH_NARROW*2;\r
-                       \r
-                       Dimension d = new Dimension(x,y);\r
-                       jPane_title.setPreferredSize(d);\r
-               }\r
-               return jPane_title;\r
+               }.execute();\r
+\r
+               StWin.setVisible(true);\r
+\r
+               resetWhenWindowClosed();\r
+               dispose();\r
        }\r
        \r
        /**\r
-        * 録画設定のエリア\r
+        * ダイアログを閉じる\r
         */\r
-       private JPanel getJPane_recsetting() {\r
-               if ( jPane_recsetting == null ) {\r
-                       jPane_recsetting = new JPanel();\r
-                       jPane_recsetting.setBorder(new LineBorder(Color.BLACK, 1));\r
-                       jPane_recsetting.setLayout(new SpringLayout());\r
-                       \r
-                       //int y = SEP_HEIGHT_NALLOW;\r
-                       int y = 0;\r
-                       int x = SEP_WIDTH_NARROW;\r
-                       \r
-                       CommonSwingUtils.putComponentOn(jPane_recsetting, jCBXPanel_recorder = new JComboBoxPanel("レコーダ",RECORDER_WIDTH,RECORDER_WIDTH),        RECORDER_WIDTH+5,       COMBO_HEIGHT+SEP_HEIGHT, x, y);\r
-                       CommonSwingUtils.putComponentOn(jPane_recsetting, jCBXPanel_encoder = new JComboBoxPanel("エンコーダ",ENCODER_WIDTH,ENCODER_WIDTH),                ENCODER_WIDTH+5,        COMBO_HEIGHT+SEP_HEIGHT, x+=RECORDER_WIDTH+5+SEP_WIDTH, y);\r
-                       CommonSwingUtils.putComponentOn(jPane_recsetting, getJLabel_encoderemptywarn(""), LABEL_WIDTH, PARTS_HEIGHT, x+=ENCODER_WIDTH+5+SEP_WIDTH+5, y+PARTS_HEIGHT);\r
-                       \r
-                       Font fo = jCBXPanel_recorder.getJComboBox().getFont();\r
-                       Font fn = fo.deriveFont(fo.getStyle()|Font.BOLD);\r
-                       jCBXPanel_recorder.getJComboBox().setFont(fn);\r
-                       jCBXPanel_recorder.getJComboBox().setForeground(Color.BLUE);\r
-                       jCBXPanel_encoder.getJComboBox().setFont(fn);\r
-                       jCBXPanel_encoder.getJComboBox().setForeground(Color.BLUE);\r
-\r
-                       // ポップアップした時に追加される幅\r
-                       jCBXPanel_recorder.addPopupWidth(100);\r
-                       jCBXPanel_encoder.addPopupWidth(100);\r
-\r
-                       y += (COMBO_HEIGHT+SEP_HEIGHT)+SEP_HEIGHT;\r
-                       x = SEP_WIDTH_NARROW;\r
-                       CommonSwingUtils.putComponentOn(jPane_recsetting, jCBXPanel_genre = new JComboBoxPanel("ジャンル",110,150),                         COMBO_WIDTH_WIDE,       COMBO_HEIGHT, x, y);\r
-                       CommonSwingUtils.putComponentOn(jPane_recsetting, jCBXPanel_subgenre = new JComboBoxPanel("サブジャンル",110,150),                        COMBO_WIDTH_WIDE,       COMBO_HEIGHT, x+=(COMBO_WIDTH_WIDE+SEP_WIDTH), y);\r
-                       CommonSwingUtils.putComponentOn(jPane_recsetting, jCBXPanel_autodel = new JComboBoxPanel("自動削除",110,110),                       COMBO_WIDTH,            COMBO_HEIGHT, x+=(COMBO_WIDTH+SEP_WIDTH)*2, y);\r
-                       CommonSwingUtils.putComponentOn(jPane_recsetting, jCBXPanel_xChapter = new JComboBoxPanel("無音部分チャプタ分割",110,110), COMBO_WIDTH,            COMBO_HEIGHT, x+=(COMBO_WIDTH+SEP_WIDTH), y);\r
-                       \r
-                       y += COMBO_HEIGHT;\r
-                       x = SEP_WIDTH_NARROW;\r
-                       CommonSwingUtils.putComponentOn(jPane_recsetting, jCBXPanel_videorate = new JComboBoxPanel("画質",110,150),                           COMBO_WIDTH_WIDE,       COMBO_HEIGHT, x, y);\r
-                       CommonSwingUtils.putComponentOn(jPane_recsetting, jCBXPanel_audiorate = new JComboBoxPanel("音質",110,110),                           COMBO_WIDTH,            COMBO_HEIGHT, x+=(COMBO_WIDTH_WIDE+SEP_WIDTH), y);\r
-                       CommonSwingUtils.putComponentOn(jPane_recsetting, jCBXPanel_bvperf = new JComboBoxPanel("高レート節約",110,110),                  COMBO_WIDTH,            COMBO_HEIGHT, x+=(COMBO_WIDTH+SEP_WIDTH), y);\r
-                       CommonSwingUtils.putComponentOn(jPane_recsetting, jCBXPanel_lvoice = new JComboBoxPanel("ライン音声選択",110,110),                       COMBO_WIDTH,            COMBO_HEIGHT, x+=(COMBO_WIDTH+SEP_WIDTH), y);\r
-                       CommonSwingUtils.putComponentOn(jPane_recsetting, jCBXPanel_msChapter = new JComboBoxPanel("DVD/シーンチャプタ分割",110,110),       COMBO_WIDTH,            COMBO_HEIGHT, x+=(COMBO_WIDTH+SEP_WIDTH), y);\r
-                       \r
-                       y += COMBO_HEIGHT;\r
-                       x = SEP_WIDTH_NARROW;\r
-                       CommonSwingUtils.putComponentOn(jPane_recsetting, jCBXPanel_folder = new JComboBoxPanel("記録先フォルダ",100,150),                       COMBO_WIDTH_WIDE,       COMBO_HEIGHT, x, y);\r
-                       CommonSwingUtils.putComponentOn(jPane_recsetting, jCBXPanel_device = new JComboBoxPanel("記録先デバイス",110,110),                       COMBO_WIDTH,            COMBO_HEIGHT, x+=(COMBO_WIDTH_WIDE+SEP_WIDTH), y);\r
-                       CommonSwingUtils.putComponentOn(jPane_recsetting, jCBXPanel_dvdcompat = new JComboBoxPanel("BD/DVD互換モード",110,110),    COMBO_WIDTH,            COMBO_HEIGHT, x+=(COMBO_WIDTH+SEP_WIDTH), y);\r
-                       CommonSwingUtils.putComponentOn(jPane_recsetting, jCBXPanel_aspect = new JComboBoxPanel("DVD記録時画面比",110,110),               COMBO_WIDTH,            COMBO_HEIGHT, x+=(COMBO_WIDTH+SEP_WIDTH), y);\r
-                       CommonSwingUtils.putComponentOn(jPane_recsetting, jCBXPanel_mvChapter = new JComboBoxPanel("音多/本編チャプタ分割",110,110),       COMBO_WIDTH,            COMBO_HEIGHT, x+=(COMBO_WIDTH+SEP_WIDTH), y);\r
+       @Override\r
+       public void doCancel() {\r
+               resetWhenWindowClosed();\r
+               dispose();\r
+       }\r
 \r
-                       y += COMBO_HEIGHT;\r
-                       //x = SEP_WIDTH_NARROW;\r
-                       CommonSwingUtils.putComponentOn(jPane_recsetting, jCBXPanel_pursues = new JComboBoxPanel("番組追従",110,110), COMBO_WIDTH, COMBO_HEIGHT, x, y);\r
-                       \r
-                       CommonSwingUtils.putComponentOn(jPane_recsetting, jCheckBox_Exec = new JCheckBoxPanel("予約実行",75,true), 75, PARTS_HEIGHT, x+COMBO_WIDTH+SEP_WIDTH*2, y+PARTS_HEIGHT);\r
-                       \r
-                       jCheckBox_Exec.setSelected(true);\r
+       /***************************************\r
+        * 番組ID取得ボタンが押された時の処理\r
+        **************************************/\r
 \r
-                       y += COMBO_HEIGHT;\r
+       /**\r
+        * 番組IDを取得する\r
+        */\r
+       public String doGetEventId() {\r
+               \r
+               final ProgDetailList tvd = vals.hide_tvd;\r
+               \r
+               StWin.clear();\r
+               \r
+               new SwingBackgroundWorker(false) {\r
                        \r
-                       // 特殊配置\r
-                       {\r
-                               int spy = SEP_HEIGHT_NALLOW+(PARTS_HEIGHT+SEP_HEIGHT_NALLOW)*2;\r
-                               x = SEP_WIDTH_NARROW+(COMBO_WIDTH_WIDE+SEP_WIDTH)+(COMBO_WIDTH+SEP_WIDTH)*4+SEP_WIDTH;\r
+                       @Override\r
+                       protected Object doWorks() throws Exception {\r
+                               TatCount tc = new TatCount();\r
+                               StWin.appendMessage(MSGID+"番組IDを取得します");\r
                                \r
-                               if (env.getEnableCHAVsetting()) {\r
-                                       CommonSwingUtils.putComponentOn(jPane_recsetting, new JLabel("放送局別の"), LABEL_WIDTH, PARTS_HEIGHT, x, spy);\r
+                               String content_id = getContentId(tvd, true);\r
+                               if ( content_id == null ) {\r
+                                       StWin.appendError(ERRID+String.format("番組IDの取得に失敗しました。所要時間: %.2f秒",tc.end()));\r
                                }\r
                                else {\r
-                                       CommonSwingUtils.putComponentOn(jPane_recsetting, new JLabel("ジャンル別の"), LABEL_WIDTH, PARTS_HEIGHT, x, spy);\r
+                                       StWin.appendMessage(MSGID+String.format("番組IDを取得しました。所要時間: %.2f秒",tc.end()));\r
                                }\r
                                \r
-                               spy+=PARTS_HEIGHT-5;\r
-                               CommonSwingUtils.putComponentOn(jPane_recsetting, getJLabel_rectype("録画設定の選択"),   LABEL_WIDTH,  PARTS_HEIGHT, x, spy);\r
-                               CommonSwingUtils.putComponentOn(jPane_recsetting, getJButton_load("開く"),                            BUTTON_WIDTH, PARTS_HEIGHT, x+SEP_WIDTH_NARROW, spy+=PARTS_HEIGHT);\r
-                               CommonSwingUtils.putComponentOn(jPane_recsetting, getJButton_save("保存"),                            BUTTON_WIDTH, PARTS_HEIGHT, x+SEP_WIDTH_NARROW, spy+=PARTS_HEIGHT);\r
-                               CommonSwingUtils.putComponentOn(jPane_recsetting, getJButton_savedefault("既定化"),          BUTTON_WIDTH, PARTS_HEIGHT, x+SEP_WIDTH_NARROW, spy+=(PARTS_HEIGHT+SEP_HEIGHT));\r
+                               return null;\r
                        }\r
                        \r
-                       x+=BUTTON_WIDTH+SEP_WIDTH_NARROW*2;\r
-                       \r
-                       Dimension d = new Dimension(x,y);\r
-                       jPane_recsetting.setPreferredSize(d);\r
-\r
-               }\r
-               return jPane_recsetting;\r
-       }\r
-\r
-       private JScrollPane getJPane_likersv() {\r
-               if (jPane_likersv == null ) {\r
-                       jPane_likersv = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);\r
-                       //jPane_likersv.setBorder(new LineBorder(Color.BLACK, 1));\r
-                       jPane_likersv.setRowHeaderView(jrhdr_likersv = new LikeRsvRowHeader());\r
-                       jPane_likersv.setViewportView(getLikeRsvTable());\r
-                       \r
-                       Dimension dh = new Dimension(LRT_HEADER_WIDTH,0);\r
-                       jPane_likersv.getRowHeader().setPreferredSize(dh);\r
-                       \r
-                       jPane_likersv.getRowHeader().setVisible(true);\r
-                       \r
-                       Dimension d = new Dimension(LIKELIST_WIDTH, PARTS_HEIGHT*LIKELIST_ROWS);\r
-                       jPane_likersv.setPreferredSize(d);\r
-               }\r
-               return jPane_likersv;\r
-       }\r
-       \r
-       private JLabel getJLabel_date(String s)\r
-       {\r
-               if (jLabel_date == null) {\r
-                       jLabel_date = new JLabel();\r
-                       jLabel_date.setText(s);\r
-               }\r
-               return(jLabel_date);\r
-       }\r
-       \r
-       private JComboBox getJComboBox_date() {\r
-               if (jComboBox_date == null) {\r
-                       jComboBox_date = new JComboBox();\r
-               }\r
-               return jComboBox_date;\r
-       }\r
-       \r
-       private JLabel getJLabel_detail(String s)\r
-       {\r
-               if (jLabel_detail == null) {\r
-                       jLabel_detail = new JLabel();\r
-                       jLabel_detail.setText(s);\r
-               }\r
-               return(jLabel_detail);\r
-       }\r
-\r
-       private JCheckBoxPanel getJCheckBox_OverlapDown2(String s, int labelWidth, boolean rev) {\r
-               if (jCheckBox_OverlapDown2 == null) {\r
-                       jCheckBox_OverlapDown2 = new JCheckBoxPanel(s,labelWidth,rev);\r
-\r
-                       jCheckBox_OverlapDown2.addActionListener(al_overlapClipClicked);\r
-               }\r
-               return(jCheckBox_OverlapDown2);\r
-       }\r
-       \r
-       private JCheckBoxPanel getJCheckBox_spoex_extend(String s, int labelWidth, boolean rev) {\r
+                       @Override\r
+                       protected void doFinally() {\r
+                               StWin.setVisible(false);\r
+                       }\r
+               }.execute();\r
                \r
-               if (jCheckBox_spoex_extend == null) {\r
-                       jCheckBox_spoex_extend = new JCheckBoxPanel(s,labelWidth,rev);\r
-\r
-                       jCheckBox_spoex_extend.addActionListener(al_spoexClicked);\r
-               }\r
-               return(jCheckBox_spoex_extend);\r
-       }\r
-       \r
-       private JScrollPane getJScrollPane_detail()\r
-       {\r
-               if (jScrollPane_detail == null) {\r
-                       jScrollPane_detail = new JScrollPane(getJTextArea_detail(),JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);\r
-                       jScrollPane_detail.setBorder(new LineBorder(Color.BLACK));\r
-               }\r
-               return(jScrollPane_detail);\r
-       }\r
-       private JTextArea getJTextArea_detail()\r
-       {\r
-               if (jTextArea_detail == null) {\r
-                       jTextArea_detail = new JTextAreaWithPopup();\r
-                       jTextArea_detail.setLineWrap(true);\r
-               }\r
-               return(jTextArea_detail);\r
-       }\r
-       \r
-       private JLabel getJLabel_rectype(String s)\r
-       {\r
-               if (jLabel_rectype == null) {\r
-                       jLabel_rectype = new JLabel();\r
-                       jLabel_rectype.setText(s);\r
-               }\r
-               return(jLabel_rectype);\r
+               CommonSwingUtils.setLocationCenter(AbsReserveDialog.this, (Component) StWin);\r
+               StWin.setVisible(true);\r
+               \r
+               return tvd.progid;\r
        }\r
        \r
-       private JButton getJButton_load(String s) {\r
-               if (jButton_load == null) {\r
-                       jButton_load = new JButton(s);\r
-                       jButton_load.addActionListener(al_loadAction);\r
+       private String getContentId(ProgDetailList tvd, boolean force) {\r
+               \r
+               String content_id = null;\r
+               \r
+               if ( ContentIdDIMORA.isValid(tvd.progid) ) {\r
+                       ContentIdDIMORA.decodeContentId(tvd.progid);\r
+                       String chid = ContentIdDIMORA.getChId();\r
+                       content_id = getContentIdById(chid, tvd.startDateTime, force);\r
                }\r
-               return jButton_load;\r
-       }\r
-       \r
-       private JButton getJButton_save(String s) {\r
-               if (jButton_save == null) {\r
-                       jButton_save = new JButton(s);\r
-                       jButton_save.addActionListener(al_saveAction);\r
+               else {\r
+                       content_id = getContentIdByName(tvd.center, tvd.startDateTime, force);\r
                }\r
-               return jButton_save;\r
-       }\r
-       // デフォルトの画質・音質等の設定の保存\r
-       private JButton getJButton_savedefault(String s) {\r
-               if (jButton_savedefault == null) {\r
-                       jButton_savedefault = new JButton(s);\r
-                       jButton_savedefault.setForeground(Color.BLUE);\r
-                       jButton_savedefault.addActionListener(al_saveDefault);\r
-                       \r
-                       jButton_savedefault.setToolTipText(TEXT_SAVEDEFAULT);\r
+               if ( content_id != null ) {\r
+                       tvd.progid = content_id;\r
+                       tvd.setContentIdStr();\r
                }\r
-               return jButton_savedefault;\r
-       }\r
 \r
-       private JLabel getJLabel_title(String s)\r
-       {\r
-               if (jLabel_title == null) {\r
-                       jLabel_title = new JLabel();\r
-                       jLabel_title.setText(s);\r
-               }\r
-               return(jLabel_title);\r
-       }\r
-       \r
-       private JLabel getJLabel_ch(String s)\r
-       {\r
-               if (jLabel_ch== null) {\r
-                       jLabel_ch= new JLabel();\r
-                       jLabel_ch.setText(s);\r
-               }\r
-               return(jLabel_ch);\r
-       }\r
-       \r
-       private JLabel getJLabel_encoderemptywarn(String s)\r
-       {\r
-               if (jLabel_encoderemptywarn == null) {\r
-                       jLabel_encoderemptywarn = new JLabel();\r
-                       jLabel_encoderemptywarn.setText(s);\r
-                       jLabel_encoderemptywarn.setForeground(Color.RED);\r
-                       //Font f= jLabel_encoderemptywarn.getFont();\r
-                       //jLabel_encoderemptywarn.setFont(f.deriveFont(f.getStyle() | Font.BOLD));\r
-               }\r
-               return(jLabel_encoderemptywarn);\r
+               return content_id;\r
        }\r
 \r
-       private JButton getJButton_aTime(String s) {\r
-               if (jButton_aTime == null) {\r
-                       jButton_aTime = new JButton();\r
-                       jButton_aTime.setText(s);\r
-                       \r
-                       jButton_aTime.addMouseListener(ml_resetStartEnd);\r
+       /**\r
+        * 番組表に存在する放送局IDで\r
+        */\r
+       private String getContentIdById(String chid, String startdatetime, boolean force) {\r
+               \r
+               Integer evid = geteventid.getEvId(chid, startdatetime, force);\r
+               \r
+               if ( force && evid == null ) {\r
+                       MWin.appendError(ERRID+"番組ID取得でエラーが発生しました: "+chid+", "+startdatetime);\r
+                       ringBeep();\r
+                       return null;    // 一発死に\r
                }\r
-               return(jButton_aTime);\r
-       }\r
-       \r
-       private JButton getJButton_zTime(String s) {\r
-               if (jButton_zTime == null) {\r
-                       jButton_zTime = new JButton();\r
-                       jButton_zTime.setText(s);\r
-                       \r
-                       jButton_zTime.addMouseListener(ml_resetStartEnd);\r
+               else if ( ! force && evid == null ) {\r
+                       System.out.println(MSGID+"キャッシュにヒットしませんでした: "+chid+", "+startdatetime);\r
+                       return null;\r
                }\r
-               return(jButton_zTime);\r
-       }\r
-\r
-       private JComboBox getJComboBox_title() {\r
-               if (jComboBox_title == null) {\r
-                       jComboBox_title = new JComboBoxWithPopup();\r
-                       jComboBox_title.addPopupWidth(150);\r
-                       jComboBox_title.setEditable(true);\r
-                       \r
-                       jComboBox_title.addItemListener(il_titleEntered);\r
+               else if ( evid == -1 ) {\r
+                       MWin.appendError(ERRID+"番組IDが取得できませんでした: "+chid+", "+startdatetime);\r
+                       return null;\r
                }\r
-               return jComboBox_title;\r
+               \r
+               ContentIdDIMORA.decodeChId(chid);\r
+               String content_id = ContentIdDIMORA.getContentId(evid);\r
+\r
+               MWin.appendMessage(MSGID+"番組IDを取得しました(byId): "+content_id);\r
+               \r
+               return content_id;\r
        }\r
        \r
        /**\r
-        * EpgDataCap_BonプラグインのCHコードとを利用してテレビ王国から番組IDを取得します\r
-        * @since 3.14.5β\r
+        * レコーダに登録された放送局IDで\r
         */\r
-       private JButton getJButton_getEventId(String s) {\r
-               if (jButton_getEventId == null) {\r
-                       jButton_getEventId = new JButton(s);\r
-                       \r
-                       jButton_getEventId.addActionListener(al_getEventId);\r
-               }\r
-               return jButton_getEventId;\r
-       }\r
-       \r
-       private JButton getJButton_addDate(String s) {\r
-               if (jButton_addDate == null) {\r
-                       jButton_addDate = new JButton(s);\r
-                       \r
-                       jButton_addDate.addActionListener(al_addDate);\r
-               }\r
-               return jButton_addDate;\r
-       }\r
+       private String getContentIdByName(String chname, String startdatetime, boolean force) {\r
+               \r
+               String chid = null;\r
+               String chidEDCB = null;\r
+               String chidREGZA = null;\r
+               \r
+               Integer evid = null;\r
+               \r
+               // 登録済みのレコーダプラグインを全部チェックしてみる\r
+               for ( HDDRecorder rec : recorders ) {\r
+                       if ( rec.isBackgroundOnly() ) {\r
+                               continue;\r
+                       }\r
 \r
-       private JComboBox getJComboBox_ch() {\r
-               if (jComboBox_ch== null) {\r
-                       jComboBox_ch = new JComboBox();\r
-               }\r
-               return jComboBox_ch;\r
-       }\r
-       \r
-       // 開始時刻\r
-       private JTextField getJTextField_ahh() {\r
-               if (jTextField_ahh == null) {\r
-                       jTextField_ahh = new JTextField();\r
-                       jTextField_ahh.setHorizontalAlignment(JTextField.CENTER);\r
-               }\r
-               return jTextField_ahh;\r
-       }\r
-       private JTextField getJTextField_amm() {\r
-               if (jTextField_amm == null) {\r
-                       jTextField_amm = new JTextField();\r
-                       jTextField_amm.setHorizontalAlignment(JTextField.CENTER);\r
-               }\r
-               return jTextField_amm;\r
-       }\r
-       private JLabel getJLabel_asep(String s)\r
-       {\r
-               if (jLabel_asep == null) {\r
-                       jLabel_asep = new JLabel(s);\r
-               }\r
-               return(jLabel_asep);\r
-       }\r
-       // 開始時刻上げ下げ\r
-       private JButton getJButton_amm_up() {\r
-               if (jButton_amm_up == null) {\r
-                       jButton_amm_up = new JButton();\r
-                       //\r
-                       jButton_amm_up.addActionListener(al_upAmm);\r
-               }\r
-               return jButton_amm_up;\r
-       }\r
-       private JButton getJButton_amm_down() {\r
-               if (jButton_amm_down == null) {\r
-                       jButton_amm_down = new JButton();\r
-                       //\r
-                       jButton_amm_down.addActionListener(al_downAmm);\r
-               }\r
-               return jButton_amm_down;\r
-       }\r
-       \r
-       //\r
-       private JTextField getJTextField_zhh() {\r
-               if (jTextField_zhh == null) {\r
-                       jTextField_zhh = new JTextField();\r
-                       jTextField_zhh.setHorizontalAlignment(JTextField.CENTER);\r
-               }\r
-               return jTextField_zhh;\r
-       }\r
-       private JTextField getJTextField_zmm() {\r
-               if (jTextField_zmm == null) {\r
-                       jTextField_zmm = new JTextField();\r
-                       jTextField_zmm.setHorizontalAlignment(JTextField.CENTER);\r
-               }\r
-               return jTextField_zmm;\r
-       }\r
-       private JLabel getJLabel_zsep(String s)\r
-       {\r
-               if (jLabel_zsep == null) {\r
-                       jLabel_zsep = new JLabel(s);\r
-               }\r
-               return(jLabel_zsep);\r
-       }\r
-       // 終了時刻上げ下げ\r
-       private JButton getJButton_zmm_up() {\r
-               if (jButton_zmm_up == null) {\r
-                       jButton_zmm_up = new JButton();\r
-                       //\r
-                       jButton_zmm_up.addActionListener(al_upZmm);\r
-               }\r
-               return jButton_zmm_up;\r
-       }\r
-       private JButton getJButton_zmm_down() {\r
-               if (jButton_zmm_down == null) {\r
-                       jButton_zmm_down = new JButton();\r
-                       //\r
-                       jButton_zmm_down.addActionListener(al_downZmm);\r
-               }\r
-               return jButton_zmm_down;\r
-       }\r
-       \r
-       private LikeRsvTable getLikeRsvTable() {\r
-               if (jtbl_likersv == null) {\r
+                       chidEDCB = chidREGZA = chid = null;\r
+                       Integer tmpEvid = null;\r
+                       \r
+                       String chcode = rec.getChCode().getCH_WEB2CODE(chname);\r
+                       if ( chcode == null ) {\r
+                               System.err.println(ERRID+"「Web番組表の放送局名」を「放送局コード」に変換できません: "+rec.getRecorderId()+" "+chname);\r
+                               continue;\r
+                       }\r
                        \r
-                       // カラム名の初期化\r
-                       ArrayList<String> cola = new ArrayList<String>();\r
-                       for ( LikeRsvColumn lc : LikeRsvColumn.values() ) {\r
-                               if ( lc.getIniWidth() >= 0 ) {\r
-                                       cola.add(lc.getName());\r
+                       chidEDCB = chid = ContentIdEDCB.getChId(chcode);\r
+                       if ( chid == null ) {\r
+                               chidREGZA = chid = ContentIdREGZA.getChId(chcode);\r
+                               if ( chid == null ) {\r
+                                       System.err.println(ERRID+"番組IDの取得に未対応のレコーダです: "+rec.getRecorderId());\r
+                                       continue;\r
                                }\r
                        }\r
-                       final String[] colname = cola.toArray(new String[0]);\r
                        \r
-                       // テーブルの基本的な設定\r
-                       DefaultTableModel model = new DefaultTableModel(colname, 0);\r
+                       if (debug) System.out.println(MSGID+"番組IDを取得します: "+rec.getRecorderId());\r
+                       \r
+                       tmpEvid = geteventid.getEvId(chid, startdatetime, force);\r
                        \r
-                       jtbl_likersv = new LikeRsvTable(model);\r
-                       jtbl_likersv.setAutoResizeMode(JNETable.AUTO_RESIZE_OFF);\r
+                       if (evid == null) evid = tmpEvid;\r
                        \r
-                       // 各カラムの幅を設定する\r
-                       DefaultTableColumnModel columnModel = (DefaultTableColumnModel)jtbl_likersv.getColumnModel();\r
-                       TableColumn column = null;\r
-                       for ( LikeRsvColumn lc : LikeRsvColumn.values() ) {\r
-                               if ( lc.getIniWidth() < 0 ) {\r
-                                       continue;\r
-                               }\r
-                               column = columnModel.getColumn(lc.ordinal());\r
-                               column.setPreferredWidth(lc.getIniWidth());\r
+                       if ( force && tmpEvid == null ) {\r
+                               MWin.appendError(ERRID+"番組ID取得でエラーが発生しました: "+chid+", "+startdatetime);\r
+                               ringBeep();\r
+                               return null;    // 一発死に\r
+                       }\r
+                       else if ( ! force && tmpEvid == null ) {\r
+                               System.out.println(MSGID+"キャッシュにヒットしませんでした: "+chid+", "+startdatetime);\r
+                               return null;\r
+                       }\r
+                       else if ( tmpEvid == -1 ) {\r
+                               System.err.println(ERRID+"番組IDが取得できませんでした: "+chid+", "+startdatetime);\r
+                               continue;\r
                        }\r
+                       \r
+                       break;\r
                }\r
                \r
-               return jtbl_likersv;\r
-       }\r
-       \r
-       private JButton getJButton_record(String s) {\r
-               if (jButton_record == null) {\r
-                       jButton_record = new JButton(s);\r
-                       jButton_record.setForeground(Color.RED);\r
-                       jButton_record.addActionListener(al_doRecord);\r
+               if ( evid == null ) {\r
+                       MWin.appendError(ERRID+"【致命的エラー】放送局IDを持つレコーダプラグインが存在しません");\r
+                       ringBeep();\r
+                       return null;\r
                }\r
-               return jButton_record;\r
-       }\r
-       \r
-       private JButton getJButton_update(String s) {\r
-               if (jButton_update == null) {\r
-                       jButton_update = new JButton();\r
-                       jButton_update.setText(s);\r
-\r
-                       jButton_update.addActionListener(al_doUpdate);\r
+               else if ( evid == -1 ) {\r
+                       MWin.appendError(ERRID+"【警告】番組IDの取得に失敗しました。開始時刻の移動や、まだ番組表サイトに情報が用意されていない場合などが考えられます。");\r
+                       ringBeep();\r
+                       return null;\r
                }\r
                \r
-               return jButton_update;\r
+               String content_id;\r
+               if ( chidREGZA != null ) {\r
+                       content_id = ContentIdREGZA.getContentId(chidREGZA, evid);\r
+               }\r
+               else {\r
+                       content_id = ContentIdEDCB.getContentId(chidEDCB, evid);\r
+               }               \r
+               \r
+               MWin.appendMessage(MSGID+"番組IDを取得しました(byName): "+content_id);\r
+               \r
+               return content_id;\r
        }\r
 \r
-       private JButton getJButton_cancel(String s) {\r
-               if (jButton_cancel == null) {\r
-                       jButton_cancel = new JButton(s);\r
-                       jButton_cancel.addActionListener(al_doCancel);\r
+       /*******************************************************************************\r
+        * コールバックメソッドの実装(録画設定)\r
+        ******************************************************************************/\r
+       \r
+       /**\r
+        * レコーダが選択されたのでテキトーな録画設定を選ぶ\r
+        */\r
+       public void doSelectRecorder(String myself) {\r
+               \r
+               System.out.println(DBGID+"選択されたレコーダ: "+myself);\r
+               \r
+               HDDRecorderList myrecs = recorders.findInstance(myself);\r
+               if ( myrecs.size() == 0 ) {\r
+                       return;\r
                }\r
-               return jButton_cancel;\r
+               HDDRecorder myrec = myrecs.get(0);\r
+               \r
+               ProgDetailList tvd = vals.hide_tvd;\r
+               TimeVal tVal = getTimeValue(tvd);\r
+               jPane_title.setTimeValue(tVal);\r
+               jPane_title.setDateItems(tvd, tVal);\r
+               \r
+               // 初期化\r
+               setRecSettingItems(recorders, myrec, tvd);\r
+               \r
+               // 選択\r
+               String enc = myrec.getEmptyEncorder(tvd.center, tVal.startDateTime, tVal.endDateTime, null, null);\r
+               ReserveList myrsv = getReserveList(myrec, enc);\r
+               jPane_recsetting.setSelectedValues(tvd, myrsv);\r
+               showUrabanList(myrec.getUrabanList());\r
        }\r
        \r
-       \r
-       \r
-       \r
        /*******************************************************************************\r
-        * 独自部品\r
+        * コールバックメソッドの実装(類似予約)\r
         ******************************************************************************/\r
        \r
-       private class LikeRsvTable extends JNETable {\r
-\r
-               private static final long serialVersionUID = 1L;\r
-\r
-               public LikeRsvTable(DefaultTableModel model) {\r
-                       super(model,true);\r
-               }\r
-               \r
-               @Override\r
-               public Object getValueAt(int row, int column) {\r
-                       if ( row == 0 ) {\r
-                               if ( column == LikeRsvColumn.TITLE.ordinal() ) {\r
-                                       if ( vals.likeRsvList.size() == 0 ) {\r
-                                               return LIKERSVID_NONE;\r
-                                       }\r
-                                       else {\r
-                                               return LIKERSVID_NOTSELECTED;\r
-                                       }\r
-                               }\r
-                               else if ( column == LikeRsvColumn.START.ordinal() ) {\r
-                                       return "-";\r
-                               }\r
-                               else if ( column == LikeRsvColumn.RECORDER.ordinal() ) {\r
-                                       return vals.hide_default_recorder.Myself();\r
-                               }\r
-                               return null;\r
-                       }\r
-                       if ( column == LikeRsvColumn.TITLE.ordinal() ) {\r
-                               return vals.likeRsvList.get(row-1).getRsv().getTitle();\r
-                       }\r
-                       else if ( column == LikeRsvColumn.START.ordinal() ) {\r
-                               return vals.likeRsvList.get(row-1).getRsv().getStartDateTime();\r
-                       }\r
-                       else if ( column == LikeRsvColumn.RECORDER.ordinal() ) {\r
-                               return vals.likeRsvList.get(row-1).getRec().Myself();\r
-                       }\r
-                       else if ( column == LikeRsvColumn.TUNER.ordinal() ) {\r
-                               return vals.likeRsvList.get(row-1).getRsv().getTuner();\r
-                       }\r
-                       return null;\r
+       /***************************************\r
+        * 類似予約が選択された時の処理\r
+        **************************************/\r
+       \r
+       /**\r
+        * 類似予約が選択されたので処理をしてほしい\r
+        */\r
+       @Override\r
+       public void doSelectLikeReserve(int row) {\r
+               if ( row == LikeReserveEditorPanel.LIKERSVTABLE_NONE ) {\r
+                       doSelectLikeReserveByProg();\r
                }\r
-               \r
-               @Override\r
-               public int getSelectedRow() {\r
-                       return super.getSelectedRow()-1;\r
+               else {\r
+                       doSelectLikeReserveByReserve(row);\r
                }\r
+       }\r
+       \r
+       // 番組情報で置き換え\r
+       private boolean doSelectLikeReserveByProg() {\r
                \r
-               @Override\r
-               public void setRowSelectionInterval(int index0, int index1) {\r
-                       super.setRowSelectionInterval(index0+1, index1+1);\r
-               }\r
+               HDDRecorder myrec = vals.hide_recorder;\r
+               ProgDetailList tvd = vals.hide_tvd;\r
+               LikeReserveList likersvlist = vals.hide_likersvlist;\r
+               AVs myavs = vals.hide_avs;\r
                \r
-               @Override\r
-               public int getRowCount() {\r
-                       if ( vals == null || vals.likeRsvList == null ) {\r
-                               return 1;\r
+               // 初期化\r
+               setTitleItems(myrec, tvd, likersvlist, false);\r
+               setRecSettingItems(recorders, myrec, tvd);\r
+\r
+               // 選択\r
+               {\r
+                       // 番組情報の選択\r
+                       jPane_title.setSelectedValues(tvd);\r
+       \r
+                       TimeVal tVal = getTimeValue(tvd);\r
+                       jPane_title.setTimeValue(tVal);\r
+                       jPane_title.setDateItems(tvd, tVal);\r
+                       \r
+                       // 録画設定の選択\r
+                       jPane_recsetting.setSelectedRecorderValue(myrec.Myself());\r
+       //selectedVrate\r
+                       String enc = myrec.getEmptyEncorder(tvd.center, tVal.startDateTime, tVal.endDateTime, null, null);\r
+                       ReserveList myrsv = getReserveList(myrec, enc);\r
+                       jPane_recsetting.setSelectedValues(tvd, myrsv);\r
+                       showUrabanList(myrec.getUrabanList());\r
+                                               \r
+                       if ( myavs != null ) {\r
+                               // ジャンル別AV設定から追加で選択する\r
+                               jPane_recsetting.setSelectedValues(myavs);\r
                        }\r
-                       return vals.likeRsvList.size()+1;\r
                }\r
+               \r
+               // 予約ボタンの状態設定\r
+               jPane_title.setEnabledRecordButton(true);\r
+               jPane_title.setEnabledUpdateButton(false);\r
+               \r
+               return true;\r
        }\r
        \r
-       private class LikeRsvRowHeader extends JTable {\r
+       // 類似予約情報で置き換え\r
+       private boolean doSelectLikeReserveByReserve(int row) {\r
                \r
-               private static final long serialVersionUID = 1L;\r
-               \r
-               public LikeRsvRowHeader() {\r
-                       super();\r
-                       \r
-                       String[] colname = {""};\r
-                       DefaultTableModel model = new DefaultTableModel(colname,0);\r
-                       this.setModel(model);\r
+               LikeReserveList likersvlist = vals.hide_likersvlist;\r
+               LikeReserveItem likersv = likersvlist.setSelectedIndex(row);\r
+               ReserveList myrsv = likersv.getRsv();\r
 \r
-                       //this.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);\r
-                       //this.setRowSelectionAllowed(false);\r
-                       this.setEnabled(false);\r
-\r
-                       DefaultTableCellRenderer cr = new DefaultTableCellRenderer() {\r
-                               \r
-                               private static final long serialVersionUID = 1L;\r
-                               \r
-                               @Override\r
-                               public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {\r
-                                       Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);\r
-                                       c.setBackground(table.getTableHeader().getBackground());\r
-                                       return c;\r
-                               };\r
-                       };\r
-                       cr.setHorizontalAlignment(JLabel.CENTER);\r
-                       cr.setOpaque(true);\r
-                       this.getColumnModel().getColumn(0).setCellRenderer(cr);\r
-               }\r
+               HDDRecorderList myrecs = new HDDRecorderList();\r
+               HDDRecorder myrec = likersv.getRec();\r
+               myrecs.add(myrec);\r
                \r
-               @Override\r
-               public Object getValueAt(int row, int column) {\r
-                       return (row==0) ? "-" : String.valueOf(row);\r
-               }\r
+               ProgDetailList tvd = vals.hide_tvd;\r
                \r
-               @Override\r
-               public int getRowCount() {\r
-                       if ( vals == null || vals.likeRsvList == null ) {\r
-                               return 1;\r
-                       }\r
-                       return vals.likeRsvList.size()+1;\r
+               // 初期化\r
+               setTitleItems(myrec, tvd, likersvlist, true);\r
+               setRecSettingItems(myrecs, myrec, tvd);\r
+               \r
+               // 選択\r
+               {\r
+                       // 番組情報の選択\r
+                       jPane_title.setSelectedValues(myrsv);\r
+                       \r
+                       // 録画設定の選択\r
+                       myrec.getEmptyEncorder(tvd.center, myrsv.getStartDateTime(), myrsv.getEndDateTime(), myrsv, null);\r
+                       jPane_recsetting.setSelectedRecorderValue(myrec.Myself());\r
+                       showUrabanList(myrec.getUrabanList());\r
+                       \r
+                       jPane_recsetting.setSelectedValues(myrsv);\r
                }\r
+\r
+               // 予約ボタンの状態設定\r
+               jPane_title.setEnabledRecordButton(true);\r
+               jPane_title.setEnabledUpdateButton(true);\r
+               \r
+               return true;\r
        }\r
 }\r
index b97a772..1eb40fd 100644 (file)
@@ -3,6 +3,7 @@ package tainavi;
 import java.awt.Color;\r
 import java.awt.Component;\r
 import java.awt.Dimension;\r
+import java.awt.Font;\r
 import java.awt.Insets;\r
 import java.awt.Point;\r
 import java.awt.event.ActionEvent;\r
@@ -81,12 +82,12 @@ public abstract class AbsReserveListView extends JScrollPane {
        /**\r
         *  予約実行をONOFFするメニューアイテム\r
         */\r
-       protected abstract JMenuItem getExecOnOffMenuItem(final boolean fexec, final String title, final String chnam, final String rsvId, final String recId);\r
+       protected abstract JMenuItem getExecOnOffMenuItem(final boolean fexec, final String start, final String title, final String chnam, final String rsvId, final String recId);\r
        \r
        /**\r
         *  予約を削除するメニューアイテム\r
         */\r
-       protected abstract JMenuItem getRemoveRsvMenuItem(final String title, final String chnam, final String rsvId, final String recId);\r
+       protected abstract JMenuItem getRemoveRsvMenuItem(final String start, final String title, final String chnam, final String rsvId, final String recId);\r
        \r
        /**\r
         *  新聞形式へジャンプするメニューアイテム\r
@@ -643,7 +644,7 @@ public abstract class AbsReserveListView extends JScrollPane {
                        rD.setVisible(false);\r
                }\r
                \r
-               if (rD.isReserved()) {\r
+               if (rD.isSucceededReserve()) {\r
                        // よそさま\r
                        updateReserveDisplay(chnam);\r
                        // じぶん\r
@@ -695,6 +696,7 @@ public abstract class AbsReserveListView extends JScrollPane {
                        final String chnam = ra.hide_chname;\r
                        final String recId = ra.recorder;\r
                        final String rsvId = ra.hide_rsvid;\r
+                       \r
                        //\r
                        if (e.getButton() == MouseEvent.BUTTON3) {\r
                                if (e.getClickCount() == 1) {\r
@@ -702,7 +704,11 @@ public abstract class AbsReserveListView extends JScrollPane {
                                        JPopupMenu pop = new JPopupMenu();\r
                                        //\r
                                        {\r
-                                               JMenuItem menuItem = new JMenuItem("予約を編集する");\r
+                                               JMenuItem menuItem = new JMenuItem(String.format("予約を編集する【%s - %s(%s)】",start,title,chnam));\r
+                                               menuItem.setForeground(new Color(0,127,0));\r
+                                               Font f = menuItem.getFont();\r
+                                               menuItem.setFont(f.deriveFont(f.getStyle()|Font.BOLD));\r
+                                               \r
                                                menuItem.addActionListener(new ActionListener() {\r
                                                        public void actionPerformed(ActionEvent e) {\r
                                                                editReserve(recId,rsvId,chnam,vrow);\r
@@ -715,13 +721,13 @@ public abstract class AbsReserveListView extends JScrollPane {
 \r
                                        // 予約実行ON・OFF\r
                                        {\r
-                                               pop.add(getExecOnOffMenuItem(fexec,title,chnam,rsvId,recId));\r
+                                               pop.add(getExecOnOffMenuItem(fexec,start,title,chnam,rsvId,recId));\r
                                        }\r
                                        \r
                                        pop.addSeparator();\r
                                        \r
                                        {\r
-                                               pop.add(getRemoveRsvMenuItem(title,chnam,rsvId,recId));\r
+                                               pop.add(getRemoveRsvMenuItem(start,title,chnam,rsvId,recId));\r
                                        }\r
                                        \r
                                        pop.addSeparator();\r
index 23e4ac9..557efa9 100644 (file)
@@ -53,7 +53,6 @@ public class CommonUtils {
         */\r
        public static void setDebug(boolean b) { debug = b; }\r
        private static boolean debug = false;\r
-       private static boolean debuglv2 = false;        // これは俺用\r
        \r
        /**\r
         *  深夜の帯予約補正に対応するかどうか\r
@@ -212,7 +211,7 @@ public class CommonUtils {
        /**\r
         *  開始・終了時刻から長さを算出する。引数の前後関係は意識しなくて良い。\r
         */\r
-       private static int getRecMinVal(int ahh, int amm, int zhh, int zmm) {\r
+       public static int getRecMinVal(int ahh, int amm, int zhh, int zmm) {\r
                int min = (zhh*60+zmm) - (ahh*60+amm);\r
                if (min < 0) min += 24*60;\r
                return min;\r
@@ -635,6 +634,13 @@ public class CommonUtils {
        }\r
        \r
        /**\r
+        * 日付を日付形式に変換。\r
+        * @return YYYY/MM/DD(WD)\r
+        */ \r
+       public static String getDate() {\r
+               return getDate(getCalendar(0), true);\r
+       }\r
+       /**\r
         * <P>「当日」の日付文字列を返します。\r
         * <P>ただし、05時~29時を当日として判断するので、<B>24時~29時に実行した場合は前日の日付が返ります</B>。\r
         * @param n : 現在日時に対して n秒 加えた日時を返します。負の値も許可されます。\r
index 0d967a9..395da8a 100644 (file)
@@ -39,7 +39,13 @@ public interface HDDRecorder {
        public static final String SELECTED_ALL = "すべて";\r
        public static final String SELECTED_PICKUP = "ピックアップのみ";\r
 \r
+       // 特殊な選択肢\r
+       public static final String ITEM_REC_TYPE_EPG            = "EPG";\r
+       public static final String ITEM_REC_TYPE_PROG           = "プログラム";\r
        \r
+       public static final String VALUE_REC_TYPE_EPG           = "EPG";\r
+       public static final String VALUE_REC_TYPE_PROG          = "PROGRAM";\r
+\r
        /*******************************************************************************\r
         * 種族の特性\r
         ******************************************************************************/\r
@@ -79,7 +85,7 @@ public interface HDDRecorder {
        \r
        public String text2value(ArrayList<TextValueSet> tvs, String text);\r
        public String value2text(ArrayList<TextValueSet> tvs, String value);\r
-\r
+       public TextValueSet getDefaultSet(ArrayList<TextValueSet> tvs);\r
        \r
        // 個体の特性 \r
        public String getIPAddr();\r
@@ -112,7 +118,25 @@ public interface HDDRecorder {
         */\r
        public void setTunerNum(int n);\r
 \r
+       /**\r
+        * 放送波の種類にあったエンコーダのリストを返します\r
+        */\r
+       public ArrayList<String> getFilteredEncoders(String webChName); \r
        \r
+       /**\r
+        * 使用されていないエンコーダのリストアップと、裏番組リストを作成します\r
+        * <P>\r
+        * @param myrsv 予約一覧から開いた場合など、選択中の予約情報はスルーしてほしい場合に指定します。それ以外はnullで\r
+        * @param selectedVrate 特定の画質に対しては特定のエンコーダを指定してやらなければならない場合に指定します(RDのみ)\r
+        * @return null:自動検索無効、"":空きエンコーダなし、その他:空きエンコーダ\r
+        */\r
+       public String getEmptyEncorder(String webChName, String startDateTime, String endDateTime, ReserveList myrsv, String selectedVrate);\r
+       \r
+       /**\r
+        * 裏番組のリストを返します\r
+        * @see #getEmptyEncorder(ProgDetailList, String)\r
+        */\r
+       public ArrayList<ReserveList> getUrabanList();\r
        \r
        /*\r
         * 予約一覧系\r
index 349df7e..9e431bd 100644 (file)
@@ -1,6 +1,9 @@
 package tainavi;\r
 \r
 import java.util.ArrayList;\r
+import java.util.Calendar;\r
+import java.util.GregorianCalendar;\r
+import java.util.HashMap;\r
 \r
 import tainavi.HDDRecorder.RecType;\r
 \r
@@ -42,6 +45,11 @@ public class HDDRecorderList extends ArrayList<HDDRecorder> {
                return mylist;\r
        }\r
        \r
+       \r
+       /***************************************\r
+        * レコーダのインスタンスを探す\r
+        **************************************/\r
+       \r
        /**\r
         * 実レコーダのプラグイン(個体)を探す\r
         * @param mySelf 「すべて」を指定する場合はNULLをどうぞ\r
@@ -66,6 +74,9 @@ public class HDDRecorderList extends ArrayList<HDDRecorder> {
                return mylist;\r
        }\r
 \r
+       /**\r
+        * 実レコーダのプラグイン(種別グループ)を探す\r
+        */\r
        public HDDRecorderList findInstance(RecType rectype) {\r
                if ( rectype == null ) {\r
                        // 全部のインスタンスを返す\r
@@ -82,4 +93,189 @@ public class HDDRecorderList extends ArrayList<HDDRecorder> {
                }\r
                return mylist;\r
        }\r
+       \r
+       \r
+       /***************************************\r
+        * 類似予約検索\r
+        **************************************/\r
+       \r
+       /**\r
+        * 類似予約検索\r
+        */\r
+       public LikeReserveList findLikeReserves(ProgDetailList tvd, String keywordVal, int thresholdVal, int range, boolean reversesearch) {\r
+               \r
+               long rangeVal = range * 3600000;        // ミリ秒に\r
+               \r
+               LikeReserveList likeRsvList = new LikeReserveList();\r
+               \r
+               for ( HDDRecorder recorder : this ) {\r
+                       \r
+                       // 終了した予約を整理する\r
+                       recorder.refreshReserves();\r
+                       \r
+                       for ( ReserveList r : recorder.getReserves() ) {\r
+                               \r
+                               // タイトルのマッチング\r
+                               if ( keywordVal != null ) {\r
+                                       if ( ! isLikeTitle(r.getTitlePop(), keywordVal, thresholdVal, reversesearch) ) {\r
+                                               continue;\r
+                                       }\r
+                               }\r
+                               else {\r
+                                       if ( ! isLikeTitle(tvd.titlePop, r.getTitlePop()) ) {\r
+                                               continue;\r
+                                       }\r
+                               }\r
+                               \r
+                               // 放送局のマッチング\r
+                               if ( ! isLikeChannel(tvd.center, r.getCh_name()) ) {\r
+                                       continue;\r
+                               }\r
+                               \r
+                               // 近接時間チェック\r
+                               Long d = getLikeDist(tvd.startDateTime, r, rangeVal);\r
+                               if ( d == null ) {\r
+                                       continue;\r
+                               }\r
+                               \r
+                               // 類似予約あり\r
+                               likeRsvList.add(new LikeReserveItem(recorder, r, d));\r
+                       }\r
+                       \r
+               }\r
+               \r
+               return likeRsvList;\r
+       }\r
+       \r
+       private boolean isLikeTitle(String rsv_titlePop, String keywordVal, int thresholdVal, boolean reversesearch) {\r
+               \r
+               // 双方向の比較を行う・正引き\r
+               int fazScore = TraceProgram.sumScore(keywordVal, rsv_titlePop);\r
+               if ( fazScore >= thresholdVal ) {\r
+                       return true;\r
+               }\r
+               else if ( reversesearch ) {\r
+                       // 逆引き\r
+                       fazScore = TraceProgram.sumScore(rsv_titlePop, keywordVal);\r
+                       if ( fazScore >= thresholdVal) {\r
+                               return true;\r
+                       }\r
+               }\r
+               \r
+               return false;\r
+       }\r
+       \r
+       private boolean isLikeTitle(String titlePop, String rsv_titlePop) {\r
+\r
+               // 完全一致\r
+               if ( rsv_titlePop.equals(titlePop)) {\r
+                       return true;\r
+               }\r
+               \r
+               return false;\r
+       }\r
+       \r
+       private boolean isLikeChannel(String webChName, String rsv_webChName) {\r
+               \r
+               if ( rsv_webChName == null ) {\r
+                       return false;\r
+               }\r
+               if ( ! rsv_webChName.equals(webChName) ) {\r
+                       return false;\r
+               }\r
+               \r
+               return true;\r
+       }\r
+       \r
+       private Long getLikeDist(String startDateTime, ReserveList r, long range) {\r
+               \r
+               Long d = null;\r
+               \r
+               ArrayList<String> starts = new ArrayList<String>();\r
+               ArrayList<String> ends = new ArrayList<String>();\r
+               CommonUtils.getStartEndList(starts, ends, r);\r
+                \r
+               for ( int j=0; j<starts.size(); j++ ) {\r
+                       long dtmp = CommonUtils.getCompareDateTime(starts.get(j),startDateTime);\r
+                       if ( range > 0 && Math.abs(dtmp) >= range ) {\r
+                               // 範囲指定があって範囲外ならスキップ\r
+                               continue;\r
+                       }\r
+                       else if ( d == null || Math.abs(d) > Math.abs(dtmp) ) {\r
+                               // 初値、または一番小さい値を採用\r
+                               d = dtmp;\r
+                       }\r
+               }\r
+               \r
+               return d;\r
+       }\r
+       \r
+       /***************************************\r
+        * 隣接予約検索\r
+        **************************************/\r
+       \r
+       public LikeReserveList findOverlapReserves(ProgDetailList tvd, String clicked) {\r
+               \r
+               LikeReserveList overlapRsvList =  new LikeReserveList();\r
+               \r
+               HashMap<String,Boolean> misCN = new HashMap<String, Boolean>(); // 使っていない…\r
+               \r
+               for ( HDDRecorder recorder : this ) {\r
+                       \r
+                       for ( ReserveList r : recorder.getReserves() ) {\r
+                               \r
+                               // 放送局のマッチング\r
+                               if (r.getCh_name() == null) {\r
+                                       if ( r.getChannel() == null ) {\r
+                                               System.err.println("予約情報にCHコードが設定されていません。バグの可能性があります。 recid="+recorder.Myself()+" chname="+r.getCh_name());\r
+                                               continue;\r
+                                       }\r
+                                       if(r.getChannel().length() > 0) {\r
+                                               misCN.put(r.getChannel(),true);\r
+                                       }\r
+                                       continue;\r
+                               }\r
+                               if ( ! r.getCh_name().equals(tvd.center)) {\r
+                                       continue;\r
+                               }\r
+                               \r
+                               // 重複時間チェック\r
+                               boolean inRange = false;\r
+                               long d = 0;\r
+                               \r
+                               {\r
+                                       ArrayList<String> starts = new ArrayList<String>();\r
+                                       ArrayList<String> ends = new ArrayList<String>();\r
+                                       CommonUtils.getStartEndList(starts, ends, r);\r
+                                       if ( clicked != null ) {\r
+                                               // 新聞形式はピンポイント(マウスポインタのある位置の時刻)\r
+                                               for (int j=0; j<starts.size(); j++) {\r
+                                                       if ( clicked.compareTo(starts.get(j)) >= 0 && clicked.compareTo(ends.get(j)) <= 0 ) {\r
+                                                               inRange = true;\r
+                                                               break;\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                                       else {\r
+                                               // リスト形式は幅がある(開始~終了までの間のいずれかの時刻)\r
+                                               for (int j=0; j<starts.size(); j++) {\r
+                                                       if ( CommonUtils.isOverlap(tvd.startDateTime, tvd.endDateTime, starts.get(j), ends.get(j), false) ) {\r
+                                                               inRange = true;\r
+                                                               d = CommonUtils.getDiffDateTime(tvd.startDateTime, starts.get(j));\r
+                                                               break;\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                               }\r
+                               if ( ! inRange) {\r
+                                       continue;\r
+                               }\r
+                               \r
+                               // 類似予約あり!\r
+                               overlapRsvList.add(new LikeReserveItem(recorder, r, d));\r
+                       }\r
+               }\r
+               \r
+               return overlapRsvList;\r
+       }\r
 }\r
index db173a4..771d059 100644 (file)
@@ -18,6 +18,7 @@ import java.util.ArrayList;
 import java.util.Calendar;\r
 import java.util.Date;\r
 import java.util.GregorianCalendar;\r
+import java.util.HashMap;\r
 import java.util.Hashtable;\r
 import java.util.List;\r
 import java.util.Map;\r
@@ -87,6 +88,8 @@ public class HDDRecorderUtils implements HDDRecorder,Cloneable {
         * 定数\r
         ******************************************************************************/\r
        \r
+       public static final String NULL_ENCODER = "■";\r
+       \r
        // メッセージID\r
        private static final String MSGID = "[レコーダ共通] ";\r
        private static final String DBGID = "[DEBUG]"+MSGID;\r
@@ -293,11 +296,174 @@ public class HDDRecorderUtils implements HDDRecorder,Cloneable {
        \r
        private ArrayList<RecordedInfo> RECORDED = new ArrayList<RecordedInfo>();\r
        \r
+       /***************************************\r
+        * 利用可能なエンコーダの絞り込み2種\r
+        **************************************/\r
+       \r
+       /**\r
+        *\r
+        */\r
+       @Override\r
+       public ArrayList<String> getFilteredEncoders(String webChName) {\r
+               \r
+               ArrayList<String> encs = new ArrayList<String>();\r
+               \r
+               if ( getEncoderList().size() == 0 ) {\r
+                       encs.add(NULL_ENCODER);\r
+                       return encs;\r
+               }\r
+               \r
+               // エンコーダーに地上波・BS/CSの区別のあるとき\r
+               if ( isBroadcastTypeNeeded() ) {\r
+                       \r
+                       String code = getChCode().getCH_WEB2CODE(webChName);\r
+                       \r
+                       if ( code != null ) {\r
+                               for ( TextValueSet enc : getEncoderList() ) {\r
+                                       if (\r
+                                                       (code.startsWith(BroadcastType.TERRA.getName()+":") && enc.getText().startsWith("地上")) ||\r
+                                                       ((code.startsWith(BroadcastType.BS.getName()+":")||code.startsWith(BroadcastType.CS.getName()+":")) && enc.getText().startsWith("BS")) ||\r
+                                                       (code.startsWith(BroadcastType.CAPTURE.getName()+":") && enc.getText().startsWith("キャプチャ"))\r
+                                                       ) {\r
+                                               encs.add(enc.getText());\r
+                                       }\r
+                               }\r
+                       }\r
+                       if ( encs.size() > 0 ) {\r
+                               return encs;\r
+                       }\r
+               }\r
+\r
+               // エンコーダーに地上波・BS/CSの区別のないとき or フィルタ結果が0件のとき\r
+               for ( TextValueSet enc : getEncoderList() ) {\r
+                       encs.add(enc.getText());\r
+               }\r
+               return encs;\r
+       }\r
+       \r
+       @Override\r
+       public String getEmptyEncorder(String webChName, String startDateTime, String endDateTime, ReserveList myrsv, String selectedVrate) {\r
+               \r
+               // エンコーダの一覧を作成する\r
+               ArrayList<String> encs = getFilteredEncoders(webChName);\r
+               \r
+               // 予約リストをなめて予約済みエンコーダーをさがつつ、裏番組リストも作る\r
+               urabanlist = new ArrayList<ReserveList>();\r
+               String rsvedTuner = null;\r
+               for ( ReserveList r : getReserves() ) {\r
+                       if ( r == myrsv ) {\r
+                               // 自分自身は排除(予約一覧から開いたときとかに使う)\r
+                               continue;\r
+                       }\r
+                       if ( ! r.getExec() ) {\r
+                               // 無効の物はいらない\r
+                               continue;\r
+                       }\r
+                       \r
+                       // 予約時間が重なるものを抽出する\r
+                       ArrayList<String> starts = new ArrayList<String>();\r
+                       ArrayList<String> ends = new ArrayList<String>();\r
+                       CommonUtils.getStartEndList(starts, ends, r);\r
+                       for ( int i=0;i<starts.size(); i++ ) {\r
+                               // 既に予約済みの場合\r
+                               if (\r
+                                               starts.get(i).equals(startDateTime) &&\r
+                                               ends.get(i).equals(endDateTime) &&\r
+                                               webChName.equals(r.getCh_name())\r
+                                               ) {\r
+                                       rsvedTuner = r.getTuner();\r
+                                       continue;\r
+                               }\r
+                               \r
+                               // 時間の重なる番組\r
+                               if ( CommonUtils.isOverlap(startDateTime, endDateTime, starts.get(i), ends.get(i), getAdjNotRep()) ) {\r
+                                       \r
+                                       // 裏番組チェック\r
+                                       if ( ! urabanlist.contains(r) ) {\r
+                                               urabanlist.add(r);\r
+                                       }\r
+                                       \r
+                                       // 予約時間が重なるものはエンコーダーの一覧から削除する\r
+                                       HashMap<String,Boolean> removeitems = new HashMap<String,Boolean>();\r
+                                       for ( String enc : encs ) {\r
+                                               if ( enc.equals(r.getTuner()) ) {\r
+                                                       \r
+                                                       removeitems.put(enc, true);\r
+                                                       \r
+                                                       // ---- RDデジタルW録向け暫定コード ----\r
+                                                       if ( enc.equals("TS1") || enc.equals("DR1") ) {\r
+                                                               // TS1が埋まっていればREは使えない\r
+                                                               removeitems.put("RE", true);\r
+                                                       }\r
+                                                       else if ( enc.equals("RE") ) {\r
+                                                               // REが埋まっていればTS1は使えない\r
+                                                               removeitems.put("TS1", true);\r
+                                                               removeitems.put("DR1", true);\r
+                                                       }\r
+                                                       // ---- RDデジタルW録向け暫定コード ----\r
+                                                       \r
+                                                       break;\r
+                                               }\r
+                                       }\r
+                                       for ( String key : removeitems.keySet() ) {\r
+                                               encs.remove(key);\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+               \r
+               if ( ! isAutoEncSelectEnabled() ) {\r
+                       // 空きエンコーダ検索は無効\r
+                       return null;\r
+               }\r
+                       \r
+               // 旧RDデジ系 - ここから\r
+               if ( selectedVrate != null ) {\r
+                       if ( ! selectedVrate.equals("[TS]") && ! selectedVrate.equals("[DR]")) {\r
+                               if ( ! encs.contains("RE") ) {\r
+                                       // 空きエンコーダはなかった\r
+                               }\r
+                               return "RE";\r
+                       }\r
+\r
+                       encs.remove("RE");\r
+               }\r
+               // 旧RDデジ系 - ここまで\r
+               \r
+               if ( encs.size() == 0  ) {\r
+                       // 空きエンコーダはなかった\r
+                       return "";\r
+               }\r
+\r
+               // 空きエンコーダがあった\r
+\r
+               if ( rsvedTuner != null ) {\r
+                       // 予約済みなら同じのでいいよね\r
+                       return rsvedTuner;\r
+               }\r
+               if ( encs.size() > 0 ) {\r
+                       // エンコーダーが残っていればそれらの先頭を返す(裏番組がない場合は除く)\r
+                       return encs.get(0);\r
+               }\r
+               \r
+               // 空きエンコーダなし\r
+               return "";\r
+       }\r
+       \r
+       @Override\r
+       public ArrayList<ReserveList> getUrabanList() {\r
+               return urabanlist;\r
+       }\r
+       \r
+       private ArrayList<ReserveList> urabanlist = null;       // 裏番組の一覧\r
+       \r
+\r
        /*******************************************************************************\r
         * 小物\r
         ******************************************************************************/\r
        \r
        // 素直にHashMapつかっておけばよかった\r
+       @Override\r
        public String text2value(ArrayList<TextValueSet> tvs, String text) {\r
                for ( TextValueSet t : tvs ) {\r
                        if (t.getText().equals(text)) {\r
@@ -306,6 +472,7 @@ public class HDDRecorderUtils implements HDDRecorder,Cloneable {
                }\r
                return("");\r
        }\r
+       @Override\r
        public String value2text(ArrayList<TextValueSet> tvs, String value) {\r
                for ( TextValueSet t : tvs ) {\r
                        if (t.getValue().equals(value)) {\r
@@ -315,6 +482,16 @@ public class HDDRecorderUtils implements HDDRecorder,Cloneable {
                return("");\r
        }\r
        \r
+       @Override\r
+       public TextValueSet getDefaultSet(ArrayList<TextValueSet> tvs) {\r
+               for ( TextValueSet t : tvs ) {\r
+                       if ( t.getDefval() ) {\r
+                               return t;\r
+                       }\r
+               }\r
+               return null;\r
+       }\r
+       \r
        protected TextValueSet add2tvs(ArrayList<TextValueSet> tvs, String text, String value) {\r
                TextValueSet t = new TextValueSet();\r
                t.setText(text);\r
index b7fd030..1eff1be 100644 (file)
@@ -2,11 +2,13 @@ package tainavi;
 \r
 import java.awt.Color;\r
 import java.awt.Dimension;\r
+import java.awt.event.ActionEvent;\r
 import java.awt.event.ActionListener;\r
 import java.awt.event.ItemListener;\r
 import java.awt.event.MouseAdapter;\r
 import java.awt.event.MouseEvent;\r
 \r
+import javax.swing.AbstractAction;\r
 import javax.swing.BoxLayout;\r
 import javax.swing.JCheckBox;\r
 import javax.swing.JLabel;\r
@@ -51,7 +53,8 @@ public class JCheckBoxPanel extends JPanel {
        private void _JCheckBoxPanelRev(String s, int labelWidth) {\r
                this.setLayout(new BoxLayout(this,BoxLayout.LINE_AXIS));\r
                \r
-               this.add(jcheckbox = new JCheckBox());\r
+               jcheckbox = new JCheckBox();\r
+               this.add(jcheckbox);\r
                \r
                jlabel = new JLabel(s);\r
                Dimension d = jlabel.getPreferredSize();\r
@@ -103,8 +106,9 @@ public class JCheckBoxPanel extends JPanel {
        }\r
 \r
        public void setForeground(Color fg) {\r
-               if (this.jlabel != null)\r
+               if (this.jlabel != null) {\r
                        this.jlabel.setForeground(fg);\r
+               }\r
        }\r
        \r
        \r
@@ -114,7 +118,14 @@ public class JCheckBoxPanel extends JPanel {
                public void mouseClicked(MouseEvent e) {\r
                        if ( jcheckbox != null ) {\r
                                jcheckbox.setSelected( ! jcheckbox.isSelected());\r
+                               \r
+                               // イベントをチェックボックスに投げる\r
+                               ActionEvent ev = new ActionEvent(jcheckbox,ActionEvent.ACTION_PERFORMED,"");\r
+                               for ( ActionListener al : jcheckbox.getActionListeners() ) {\r
+                                       al.actionPerformed(ev);\r
+                               }\r
                        }\r
                }\r
        };\r
+       \r
 }\r
index 386cb64..d10f634 100644 (file)
@@ -97,6 +97,10 @@ public class JComboBoxPanel extends JPanel implements ItemSelectable,WideCompone
                return this.jcombobox.getItemCount();\r
        }\r
        \r
+       public int indexOf(Object o) {\r
+               return this.jcombobox.indexOf(o);\r
+       }\r
+       \r
        public void setSelectedItem(Object o) {\r
                this.jcombobox.setSelectedItem(o);\r
        }\r
index 83f761b..8b2d7b9 100644 (file)
@@ -48,6 +48,16 @@ public class JWideComboBox extends JComboBox implements WideComponent {
                });\r
        }\r
 \r
+       public int indexOf(Object o) {\r
+               for ( int i=0; i<this.getItemCount(); i++ ) {\r
+                       Object obj = this.getItemAt(i);\r
+                       if ( (o != null && obj != null && o.equals(obj)) || o == obj ) {\r
+                               return i;\r
+                       }\r
+               }\r
+               return -1;\r
+       }\r
+       \r
        private boolean layingOut = false; \r
     \r
        private int w = 50;\r
diff --git a/TinyBannavi/src/tainavi/LikeReserveEditorPanel.java b/TinyBannavi/src/tainavi/LikeReserveEditorPanel.java
new file mode 100644 (file)
index 0000000..23510d9
--- /dev/null
@@ -0,0 +1,391 @@
+package tainavi;\r
+\r
+import java.awt.Color;\r
+import java.awt.Component;\r
+import java.awt.Dimension;\r
+import java.util.ArrayList;\r
+\r
+import javax.swing.JLabel;\r
+import javax.swing.JScrollPane;\r
+import javax.swing.JTable;\r
+import javax.swing.border.LineBorder;\r
+import javax.swing.event.ListSelectionEvent;\r
+import javax.swing.event.ListSelectionListener;\r
+import javax.swing.table.DefaultTableCellRenderer;\r
+import javax.swing.table.DefaultTableColumnModel;\r
+import javax.swing.table.DefaultTableModel;\r
+import javax.swing.table.TableCellRenderer;\r
+import javax.swing.table.TableColumn;\r
+\r
+\r
+/**\r
+ * 予約ダイアログを目的ごとに3ブロックにわけたうちの「類似予約リスト」部分のコンポーネント\r
+ * @since 3.22.2β\r
+ */\r
+public class LikeReserveEditorPanel extends JScrollPane {\r
+       \r
+       private static final long serialVersionUID = 1L;\r
+       \r
+       public void setDebug(boolean b) { debug = b;}\r
+       private static boolean debug = true;\r
+\r
+       /*******************************************************************************\r
+        * 定数\r
+        ******************************************************************************/\r
+\r
+       public static final int LIKERSVTABLE_NONE = -1;\r
+       public static final int LIKERSVTABLE_NOTSELECTED = -2;\r
+       \r
+       private static final String LIKERSVID_NONE                      = "(類似予約なし)";\r
+       private static final String LIKERSVID_NOTSELECTED       = "類似予約を選択しない";\r
+       \r
+       // レイアウト関連\r
+       private static final int PARTS_HEIGHT = 25;\r
+       \r
+       private static final int LIKELIST_WIDTH = 730;\r
+       private static final int LIKELIST_ROWS = 5;\r
+       \r
+       private static final int LRT_HEADER_WIDTH = 20;\r
+       private static final int LRT_TITLE_WIDTH = 325;\r
+       private static final int LRT_START_WIDTH = 120;\r
+       private static final int LRT_RECORDER_WIDTH = 200;\r
+       private static final int LRT_ENCODER_WIDTH = 80;\r
+       \r
+       // テーブルのカラムの定義\r
+       public static enum LikeRsvColumn {\r
+               TITLE           ("予約名",   LRT_TITLE_WIDTH),\r
+               START           ("開始日時",        LRT_START_WIDTH),\r
+               RECORDER        ("レコーダ",        LRT_RECORDER_WIDTH),\r
+               TUNER           ("エンコーダ",  LRT_ENCODER_WIDTH),\r
+               ;\r
+\r
+               private String name;\r
+               private int iniWidth;\r
+\r
+               private LikeRsvColumn(String name, int iniWidth) {\r
+                       this.name = name;\r
+                       this.iniWidth = iniWidth;\r
+               }\r
+\r
+               public String getName() {\r
+                       return name;\r
+               }\r
+\r
+               public int getIniWidth() {\r
+                       return iniWidth;\r
+               }\r
+               \r
+               public int getColumn() {\r
+                       return ordinal();\r
+               }\r
+               \r
+               public boolean equals(String s) {\r
+                       return name.equals(s);\r
+               }\r
+       };\r
+       \r
+       // ログ関連\r
+       private static final String MSGID = "[類似予約テーブル] ";\r
+       //private static final String ERRID = "[ERROR]"+MSGID;\r
+       private static final String DBGID = "[DEBUG]"+MSGID;\r
+       \r
+       /*******************************************************************************\r
+        * コンポーネント\r
+        ******************************************************************************/\r
+\r
+       private LikeRsvTable jtbl_likersv = null;\r
+       private LikeRsvRowHeader jrhdr_likersv = null;\r
+       \r
+       \r
+       /*******************************************************************************\r
+        * 部品\r
+        ******************************************************************************/\r
+       \r
+       private LikeReserveSelectable likesrvsel = null;\r
+       \r
+       \r
+       /*******************************************************************************\r
+        * コンストラクタ\r
+        ******************************************************************************/\r
+       \r
+       public LikeReserveEditorPanel() {\r
+               \r
+               super(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);\r
+               \r
+               setBorder(new LineBorder(Color.BLACK, 1));\r
+               setRowHeaderView(getLikeRsvRowHeader());\r
+               setViewportView(getLikeRsvTable());\r
+               \r
+               Dimension dh = new Dimension(LRT_HEADER_WIDTH,0);\r
+               getRowHeader().setPreferredSize(dh);\r
+               \r
+               getRowHeader().setVisible(true);\r
+               \r
+               Dimension d = new Dimension(LIKELIST_WIDTH, (int)(PARTS_HEIGHT*LIKELIST_ROWS+PARTS_HEIGHT*0.5));\r
+               setPreferredSize(d);\r
+               \r
+               // 選択行が表示されるよう自動で移動するようにする\r
+               CommonSwingUtils.setSelectedRowShown(jtbl_likersv);\r
+       }\r
+       \r
+       public void setLikeReserveSelector(LikeReserveSelectable o) {\r
+               likesrvsel = o;\r
+       }\r
+       \r
+       /*******************************************************************************\r
+        * その他\r
+        ******************************************************************************/\r
+       \r
+       public void setEnabledTable(boolean enabled) {\r
+               jtbl_likersv.setEnabled(enabled);\r
+       }\r
+       \r
+       \r
+       /*******************************************************************************\r
+        * リスナー\r
+        ******************************************************************************/\r
+       \r
+       /***************************************\r
+        * 行選択した際のイベントリスナー\r
+        **************************************/\r
+       \r
+       private final ListSelectionListener lsl_likersvSelected = new ListSelectionListener() {\r
+               \r
+               @Override\r
+               public void valueChanged(ListSelectionEvent e) {\r
+                   if ( e.getValueIsAdjusting() ) {\r
+                       return;\r
+                   }\r
+                   \r
+                   if ( ! jtbl_likersv.isEnabled() ) {\r
+                               //return;\r
+                       }\r
+                   \r
+                   int row = jtbl_likersv.getSelectedRow();\r
+                   if ( row == LIKERSVTABLE_NOTSELECTED ) {\r
+                       return;\r
+                   }\r
+                   \r
+                   if (debug) System.out.println(DBGID+"選択された類似予約: "+row);\r
+                   likesrvsel.doSelectLikeReserve(row);\r
+               }\r
+       };\r
+       \r
+       \r
+       /*******************************************************************************\r
+        * コンポーネント\r
+        ******************************************************************************/\r
+       \r
+       private LikeRsvRowHeader getLikeRsvRowHeader() {\r
+               if ( jrhdr_likersv == null ) {\r
+                       jrhdr_likersv = new LikeRsvRowHeader();\r
+               }\r
+               return jrhdr_likersv;\r
+       }\r
+       \r
+       private LikeRsvTable getLikeRsvTable() {\r
+               if (jtbl_likersv == null) {\r
+                       \r
+                       // カラム名の初期化\r
+                       ArrayList<String> cola = new ArrayList<String>();\r
+                       for ( LikeRsvColumn lc : LikeRsvColumn.values() ) {\r
+                               if ( lc.getIniWidth() >= 0 ) {\r
+                                       cola.add(lc.getName());\r
+                               }\r
+                       }\r
+                       final String[] colname = cola.toArray(new String[0]);\r
+                       \r
+                       // テーブルの基本的な設定\r
+                       DefaultTableModel model = new DefaultTableModel(colname, 0);\r
+                       \r
+                       jtbl_likersv = new LikeRsvTable(model);\r
+                       jtbl_likersv.setAutoResizeMode(JNETable.AUTO_RESIZE_OFF);\r
+                       \r
+                       // 各カラムの幅を設定する\r
+                       DefaultTableColumnModel columnModel = (DefaultTableColumnModel)jtbl_likersv.getColumnModel();\r
+                       TableColumn column = null;\r
+                       for ( LikeRsvColumn lc : LikeRsvColumn.values() ) {\r
+                               if ( lc.getIniWidth() < 0 ) {\r
+                                       continue;\r
+                               }\r
+                               column = columnModel.getColumn(lc.ordinal());\r
+                               column.setPreferredWidth(lc.getIniWidth());\r
+                       }\r
+                       \r
+                       // 行選択した際のイベントリスナー\r
+                       jtbl_likersv.getSelectionModel().addListSelectionListener(lsl_likersvSelected);\r
+               }\r
+               \r
+               return jtbl_likersv;\r
+       }\r
+       \r
+       \r
+       /*******************************************************************************\r
+        * \r
+        ******************************************************************************/\r
+\r
+       public void setListItems(LikeReserveList lrl) {\r
+               \r
+               jtbl_likersv.setDataList(lrl);\r
+               jrhdr_likersv.setDataList(lrl);\r
+               \r
+               ((DefaultTableModel)jtbl_likersv.getModel()).fireTableDataChanged();\r
+               ((DefaultTableModel)jrhdr_likersv.getModel()).fireTableDataChanged();\r
+               \r
+               setEnabledTable(lrl.size() > 0);\r
+       }\r
+       \r
+       public void setRowSelection(int row) {\r
+               jtbl_likersv.setRowSelectionInterval(row, row);\r
+       }\r
+       \r
+       /*******************************************************************************\r
+        * 独自部品\r
+        ******************************************************************************/\r
+       \r
+       private class LikeRsvTable extends JNETable {\r
+\r
+               private static final long serialVersionUID = 1L;\r
+\r
+               private LikeReserveList likersvlist = null;\r
+               \r
+               public LikeRsvTable(DefaultTableModel model) {\r
+                       super(model,true);\r
+               }\r
+               \r
+               public void setDataList(LikeReserveList lrl) {\r
+                       likersvlist = lrl;\r
+               }\r
+               \r
+               private Color disabledColor = new Color(180,180,180);\r
+               \r
+               @Override\r
+               public Component prepareRenderer(TableCellRenderer tcr, int row, int column) {\r
+                       Component c = super.prepareRenderer(tcr, row, column);\r
+                       Color bgColor = null;\r
+                       if(isRowSelected(row)) {\r
+                               bgColor = super.getSelectionBackground();\r
+                       }\r
+                       else {\r
+                               if ( row > 0 && ! likersvlist.get(row-1).getRsv().getExec() ) {\r
+                                       bgColor = disabledColor;\r
+                               }\r
+                               else {\r
+                                       bgColor = super.getBackground();\r
+                               }\r
+                       }\r
+                       c.setBackground(bgColor);\r
+                       return c;\r
+               }\r
+               \r
+               @Override\r
+               public Object getValueAt(int row, int column) {\r
+                       if ( row == 0 ) {\r
+                               // "類似予約なし"\r
+                               if ( column == LikeRsvColumn.TITLE.ordinal() ) {\r
+                                       if ( likersvlist.size() == 0 ) {\r
+                                               return LIKERSVID_NONE;\r
+                                       }\r
+                                       else {\r
+                                               return LIKERSVID_NOTSELECTED;\r
+                                       }\r
+                               }\r
+                               else if ( column == LikeRsvColumn.START.ordinal() ) {\r
+                                       return "-";\r
+                               }\r
+                               else if ( column == LikeRsvColumn.RECORDER.ordinal() ) {\r
+                                       return null;\r
+                               }\r
+                               return null;\r
+                       }\r
+                       \r
+                       // 類似予約は表示とデータが一行ずれる\r
+                       int drow = row-1;\r
+                       \r
+                       if ( column == LikeRsvColumn.TITLE.ordinal() ) {\r
+                               return likersvlist.get(drow).getRsv().getTitle();\r
+                       }\r
+                       else if ( column == LikeRsvColumn.START.ordinal() ) {\r
+                               return likersvlist.get(drow).getRsv().getStartDateTime();\r
+                       }\r
+                       else if ( column == LikeRsvColumn.RECORDER.ordinal() ) {\r
+                               return likersvlist.get(drow).getRec().Myself();\r
+                       }\r
+                       else if ( column == LikeRsvColumn.TUNER.ordinal() ) {\r
+                               return likersvlist.get(drow).getRsv().getTuner();\r
+                       }\r
+                       return null;\r
+               }\r
+\r
+               // この設計はよくなかったか…\r
+               @Override\r
+               public int getSelectedRow() {\r
+                       return super.getSelectedRow()-1;\r
+               }\r
+               \r
+               @Override\r
+               public void setRowSelectionInterval(int index0, int index1) {\r
+                       super.setRowSelectionInterval(index0+1, index1+1);\r
+               }\r
+               \r
+               @Override\r
+               public int getRowCount() {\r
+                       if ( likersvlist == null ) {\r
+                               return 1;\r
+                       }\r
+                       return likersvlist.size()+1;\r
+               }\r
+       }\r
+       \r
+       private class LikeRsvRowHeader extends JTable {\r
+               \r
+               private static final long serialVersionUID = 1L;\r
+               \r
+               private LikeReserveList likersvlist = null;\r
+               \r
+               public LikeRsvRowHeader() {\r
+                       super();\r
+                       \r
+                       String[] colname = {""};\r
+                       DefaultTableModel model = new DefaultTableModel(colname,0);\r
+                       this.setModel(model);\r
+\r
+                       //this.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);\r
+                       //this.setRowSelectionAllowed(false);\r
+                       this.setEnabled(false);\r
+\r
+                       DefaultTableCellRenderer cr = new DefaultTableCellRenderer() {\r
+                               \r
+                               private static final long serialVersionUID = 1L;\r
+                               \r
+                               @Override\r
+                               public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {\r
+                                       Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);\r
+                                       c.setBackground(table.getTableHeader().getBackground());\r
+                                       return c;\r
+                               };\r
+                       };\r
+                       cr.setHorizontalAlignment(JLabel.CENTER);\r
+                       cr.setOpaque(true);\r
+                       this.getColumnModel().getColumn(0).setCellRenderer(cr);\r
+               }\r
+               \r
+               public void setDataList(LikeReserveList lrl) {\r
+                       likersvlist = lrl;\r
+               }\r
+               \r
+               @Override\r
+               public Object getValueAt(int row, int column) {\r
+                       return (row==0) ? "-" : String.valueOf(row);\r
+               }\r
+               \r
+               @Override\r
+               public int getRowCount() {\r
+                       if ( likersvlist  == null ) {\r
+                               return 1;\r
+                       }\r
+                       return likersvlist.size()+1;\r
+               }\r
+       }\r
+       \r
+}\r
index ef87062..8c12a8b 100644 (file)
@@ -7,33 +7,60 @@ public class LikeReserveList extends ArrayList<LikeReserveItem> {
 \r
        private static final long serialVersionUID = 1L;\r
 \r
-\r
-       //\r
-       private LikeReserveItem closest = null;\r
-       \r
-       public ReserveList getRsv(int i) { return this.get(i).getRsv(); }\r
-       public ReserveList getRsv() { return ((closest!=null)?closest.getRsv():null); }\r
-       \r
-       public HDDRecorder getRec(int i) { return this.get(i).getRec(); }\r
-       public HDDRecorder getRec() { return ((closest!=null)?closest.getRec():null); }\r
        \r
+       /**\r
+        * 一番開始日時が近い類似予約を選択\r
+        */\r
        public LikeReserveItem getClosest(String myself) {\r
                \r
                closest = null;\r
+               closestIndex = -1;\r
                \r
-               for ( LikeReserveItem lr : this ) {\r
+               for ( int i=0; i<size(); i++ ) {\r
+                       LikeReserveItem lr = get(i);\r
                        if ( (myself!=HDDRecorder.SELECTED_ALL && myself!=HDDRecorder.SELECTED_PICKUP) && ! lr.getRec().Myself().equals(myself) ) {\r
                                // レコーダの個別指定があれば\r
                                continue;\r
                        }\r
                        if ( closest == null || Math.abs(closest.getDist()) > lr.getDist() ) {\r
                                closest = lr;\r
+                               closestIndex = i;\r
                        }\r
                }\r
                \r
                return closest;\r
        }\r
+       \r
+       public LikeReserveItem getClosest() { return closest; }\r
+       public int getClosestIndex() { return closestIndex; }\r
 \r
+       private LikeReserveItem closest = null;\r
+       private int closestIndex = -1;\r
+       \r
+\r
+       /**\r
+        * 選択された類似予約を取得\r
+        */\r
+       public LikeReserveItem getSelected() { return selected; }\r
+       private LikeReserveItem selected = null;\r
+       \r
+       /**\r
+        * get()を行いつつget()の結果の記録もする\r
+        * <P><I>注意!get()はイテレータの中で使用されるので、get()をoverrideするとループによりselectedの値が変動してしまう!!</I>\r
+        */\r
+       public LikeReserveItem setSelectedIndex(int index) {\r
+               return selected = super.get(index);\r
+       }\r
+       \r
+       /**\r
+        * つかってもいいけどselectedが使えないよ。{@link #setSelectedIndex(int)}を使ってね\r
+        */\r
+       @Deprecated\r
+       @Override\r
+       public LikeReserveItem get(int index) {\r
+               return super.get(index);\r
+       }\r
+       \r
        /**\r
         * 時刻昇順で並べる\r
         */\r
@@ -45,7 +72,7 @@ public class LikeReserveList extends ArrayList<LikeReserveItem> {
                }\r
                \r
                for ( int i=0; i<size(); i++ ) {\r
-                       LikeReserveItem lr = get(i);\r
+                       LikeReserveItem lr = super.get(i);\r
                        if ( lr.getDist() > element.getDist() ) {\r
                                super.add(i, element);\r
                                return true;\r
@@ -55,6 +82,7 @@ public class LikeReserveList extends ArrayList<LikeReserveItem> {
                return super.add(element);\r
        }\r
        \r
+       \r
        /**\r
         * つかっちゃヤーン\r
         */\r
@@ -64,4 +92,23 @@ public class LikeReserveList extends ArrayList<LikeReserveItem> {
                this.add(element);\r
        }\r
 \r
+       /**\r
+        * 重複する予約情報を持つ類似予約を削除する\r
+        */\r
+       public LikeReserveItem removeDup(LikeReserveItem item) {\r
+               int index = indexOfDup(item);\r
+               if ( index < 0 ) {\r
+                       return null;\r
+               }\r
+               return super.remove(index);\r
+       }\r
+       \r
+       private int indexOfDup(LikeReserveItem item) {\r
+               for ( int i=0; i<size(); i++ ) {\r
+                       if ( item.getRsv() == super.get(i).getRsv() ) {\r
+                               return i;\r
+                       }\r
+               }\r
+               return -1;\r
+       }\r
 }\r
diff --git a/TinyBannavi/src/tainavi/LikeReserveSelectable.java b/TinyBannavi/src/tainavi/LikeReserveSelectable.java
new file mode 100644 (file)
index 0000000..f6d5515
--- /dev/null
@@ -0,0 +1,10 @@
+package tainavi;\r
+\r
+public interface LikeReserveSelectable {\r
+\r
+       /**\r
+        * 類似予約が選択されたので処理をしてほしい\r
+        */\r
+       public void doSelectLikeReserve(int row);\r
+       \r
+}\r
index 853b3e0..cb13f5f 100644 (file)
@@ -87,14 +87,8 @@ public class PlugIn_RecDIGA_DMR_BWT2100 extends HDDRecorderUtils implements HDDR
        \r
        private static final String ITEM_VIDEO_TYPE_NONE        = "LAN予約";\r
        \r
-       private static final String ITEM_REC_TYPE_EPG           = "EPG";\r
-       private static final String ITEM_REC_TYPE_PROG          = "プログラム";\r
-       \r
        private static final String VALUE_VIDEO_TYPE_NONE       = "#NONE#";\r
        \r
-       private static final String VALUE_REC_TYPE_EPG          = "EPG";\r
-       private static final String VALUE_REC_TYPE_PROG         = "PROGRAM";\r
-       \r
        private static final String DIGAMSG_WAITFORLOGIN        = "DIGAと通信中です。しばらくお待ちください。";\r
        private static final String DIGAMSG_PLEASELOGIN         = "ログインしてからアクセスしてください。";\r
        private static final String DIGAMSG_BUSYNOW                     = "本体操作中、または現在実行できない操作です。";\r
index 8a854ba..8369052 100644 (file)
@@ -12,6 +12,8 @@ import java.util.regex.Matcher;
 import java.util.regex.Pattern;\r
 \r
 import taiSync.ReserveInfo;\r
+import tainavi.TVProgram.ProgGenre;\r
+import tainavi.TVProgram.ProgSubgenre;\r
 \r
 \r
 /**\r
@@ -101,9 +103,6 @@ public class PlugIn_RecRD_EDCB extends HDDRecorderUtils implements HDDRecorder,C
        \r
        private static final String ITEM_JUST_ENABLE            = "する";\r
 \r
-       private static final String ITEM_REC_TYPE_EPG           = "EPG";\r
-       private static final String ITEM_REC_TYPE_PROG          = "プログラム";\r
-\r
        private static final String ITEM_PRESETID_REG           = "予約時";\r
 \r
        private static final String ITEM_MARGINE_DEFAULT        = "デフォルト";\r
@@ -125,9 +124,6 @@ public class PlugIn_RecRD_EDCB extends HDDRecorderUtils implements HDDRecorder,C
        private static final String VALUE_TRACE_DISABLE         = "0";\r
        private static final String VALUE_TRACE_ENABLE          = "1";\r
 \r
-       private static final String VALUE_REC_TYPE_EPG          = "EPG";\r
-       private static final String VALUE_REC_TYPE_PROG         = "PROGRAM";\r
-\r
        private static final String VALUE_PRESETID_REG          = "65535";\r
        \r
        private static final String VALUE_MARGINE_DEFAULT       = "FF";\r
@@ -1027,6 +1023,12 @@ public class PlugIn_RecRD_EDCB extends HDDRecorderUtils implements HDDRecorder,C
                        //XcopyAttributes(r, getReserves());\r
                        \r
                        /*\r
+                        * APIではジャンルがとれない\r
+                        */\r
+                       r.setRec_genre(ProgGenre.NOGENRE.toString());\r
+                       r.setRec_subgenre(ProgSubgenre.NOGENRE_ETC.toString());\r
+                       \r
+                       /*\r
                         * 追加\r
                         */\r
                        newReserveList.add(r);\r
index 09c4915..0ebad0e 100644 (file)
@@ -78,12 +78,6 @@ public class PlugIn_RecRD_TvRock extends HDDRecorderUtils implements HDDRecorder
         * 定数\r
         ******************************************************************************/\r
        \r
-       private static final String ITEM_REC_TYPE_EPG           = "EPG";\r
-       private static final String ITEM_REC_TYPE_PROG          = "プログラム";\r
-       \r
-       private static final String VALUE_REC_TYPE_EPG          = "EPG";\r
-       private static final String VALUE_REC_TYPE_PROG         = "PROGRAM";\r
-\r
        private static final String ITEM_CH_EPGGET              = "[番組情報取得スケジュール]";\r
        \r
        private static final String VALUE_CH_EPGGET             = "";\r
@@ -966,7 +960,7 @@ public class PlugIn_RecRD_TvRock extends HDDRecorderUtils implements HDDRecorder
        \r
        // 各番組の、指定されている値を取得する\r
        private String getSelectedSetting(String key, String res) {\r
-               Matcher mb = Pattern.compile("<select name=\""+key+"\">.*?<option value=\"([^\"]+?)\"\\s*selected>(.+?)</option>.*?</select>").matcher(res);\r
+               Matcher mb = Pattern.compile("<select name=\""+key+"\">.*?<option value=\"([^\"]*?)\"\\s*selected>(.+?)</option>.*?</select>").matcher(res);\r
                if (mb.find()) {\r
                        return mb.group(2);\r
                }\r
@@ -1844,7 +1838,8 @@ public class PlugIn_RecRD_TvRock extends HDDRecorderUtils implements HDDRecorder
        // 既存ユーザが混乱するのでデフォルトはプログラム予約\r
        private void setSettingRecType(ArrayList<TextValueSet> tvs) {\r
                tvs.clear();\r
-               add2tvs(tvs,ITEM_REC_TYPE_PROG,VALUE_REC_TYPE_PROG);\r
+               TextValueSet t = add2tvs(tvs,ITEM_REC_TYPE_PROG,VALUE_REC_TYPE_PROG);\r
+               t.setDefval(true);\r
                add2tvs(tvs,ITEM_REC_TYPE_EPG,VALUE_REC_TYPE_EPG);\r
        }\r
        \r
@@ -1855,6 +1850,9 @@ public class PlugIn_RecRD_TvRock extends HDDRecorderUtils implements HDDRecorder
                        TextValueSet t = new TextValueSet();\r
                        t.setText(String.valueOf(i));\r
                        t.setValue(String.valueOf(i));\r
+                       if ( i == 0 ) {\r
+                               t.setDefval(true);\r
+                       }\r
                        tvs.add(t);\r
                }\r
        }\r
diff --git a/TinyBannavi/src/tainavi/RecSettingEditorPanel.java b/TinyBannavi/src/tainavi/RecSettingEditorPanel.java
new file mode 100644 (file)
index 0000000..1ee3645
--- /dev/null
@@ -0,0 +1,885 @@
+package tainavi;\r
+\r
+import java.awt.Color;\r
+import java.awt.Dimension;\r
+import java.awt.ItemSelectable;\r
+import java.awt.event.ActionEvent;\r
+import java.awt.event.ActionListener;\r
+import java.awt.event.ItemEvent;\r
+import java.awt.event.ItemListener;\r
+import java.util.ArrayList;\r
+\r
+import javax.swing.JButton;\r
+import javax.swing.JComboBox;\r
+import javax.swing.JLabel;\r
+import javax.swing.JPanel;\r
+import javax.swing.SpringLayout;\r
+import javax.swing.border.LineBorder;\r
+\r
+import tainavi.TVProgram.ProgGenre;\r
+import tainavi.TVProgram.ProgSubgenre;\r
+\r
+\r
+/**\r
+ * 予約ダイアログを目的ごとに3ブロックにわけたうちの「録画設定」部分のコンポーネント\r
+ * @since 3.22.2β\r
+ */\r
+public class RecSettingEditorPanel extends JPanel {\r
+\r
+       private static final long serialVersionUID = 1L;\r
+       \r
+       public void setDebug(boolean b) { debug = b; }\r
+       private static boolean debug = false;\r
+\r
+       /*******************************************************************************\r
+        * 定数\r
+        ******************************************************************************/\r
+       \r
+       private static final String ITEM_YES = "する";\r
+       private static final String ITEM_NO = "しない";\r
+       \r
+       private static final int PARTS_HEIGHT = 25;\r
+       private static final int SEP_WIDTH = 10;\r
+       private static final int SEP_WIDTH_NARROW = 5;\r
+       private static final int SEP_HEIGHT = 10;\r
+       private static final int SEP_HEIGHT_NALLOW = 5;\r
+       \r
+       private static final int LABEL_WIDTH = 150;\r
+       private static final int BUTTON_WIDTH = 75;\r
+       \r
+       private static final int COMBO_WIDTH = 115;\r
+       private static final int COMBO_WIDTH_WIDE = 155;\r
+       private static final int COMBO_HEIGHT = 43;\r
+\r
+       private static final int RECORDER_WIDTH = COMBO_WIDTH_WIDE*2+SEP_WIDTH_NARROW;\r
+       private static final int ENCODER_WIDTH = COMBO_WIDTH*2+SEP_WIDTH_NARROW;\r
+\r
+       private static final String TEXT_SAVEDEFAULT = "<HTML>録画設定を開いた時の枠内のデフォルト値として<BR>現在の値を使用するようにします。<BR><FONT COLOR=#FF0000>※ジャンル別AV設定があればそちらが優先されます。</FONT></HTML>";\r
+\r
+       // ログ関連\r
+       \r
+       private static final String MSGID = "[録画設定編集] ";\r
+       private static final String ERRID = "[ERROR]"+MSGID;\r
+       private static final String DBGID = "[DEBUG]"+MSGID;\r
+       \r
+       /*******************************************************************************\r
+        * 部品\r
+        ******************************************************************************/\r
+       \r
+       private JComboBoxPanel jCBXPanel_recorder = null;\r
+       private JComboBoxPanel jCBXPanel_encoder = null;\r
+       private JLabel jLabel_encoderemptywarn = null;\r
+       \r
+       private JComboBoxPanel jCBXPanel_genre = null;\r
+       private JComboBoxPanel jCBXPanel_subgenre = null;\r
+       private JComboBoxPanel jCBXPanel_videorate = null;\r
+       private JComboBoxPanel jCBXPanel_audiorate = null;\r
+       private JComboBoxPanel jCBXPanel_folder = null;\r
+       private JComboBoxPanel jCBXPanel_dvdcompat = null;\r
+       private JComboBoxPanel jCBXPanel_device = null;\r
+       private JComboBoxPanel jCBXPanel_aspect = null;\r
+       private JComboBoxPanel jCBXPanel_bvperf = null;\r
+       private JComboBoxPanel jCBXPanel_lvoice = null;\r
+       private JComboBoxPanel jCBXPanel_autodel = null;\r
+       private JComboBoxPanel jCBXPanel_pursues = null;\r
+       private JComboBoxPanel jCBXPanel_xChapter = null;\r
+       private JComboBoxPanel jCBXPanel_msChapter = null;\r
+       private JComboBoxPanel jCBXPanel_mvChapter = null;\r
+       \r
+       private JLabel jLabel_rectype = null;\r
+       private JButton jButton_load = null;\r
+       private JButton jButton_save = null;\r
+       private JButton jButton_savedefault = null;\r
+       \r
+       private JCheckBoxPanel jCheckBox_Exec = null;\r
+\r
+       //\r
+       private RecSettingSelectable recsetsel = null;\r
+       \r
+       \r
+       /*******************************************************************************\r
+        * コンストラクタ\r
+        ******************************************************************************/\r
+       \r
+       public RecSettingEditorPanel() {\r
+\r
+               super();\r
+               setBorder(new LineBorder(Color.BLACK, 1));\r
+               \r
+               addComponents();\r
+               \r
+               // 外部要因に左右されないアイテム群の設定\r
+               setGenreItems();\r
+               \r
+               // 付けたり外したりしないリスナー\r
+               jCBXPanel_genre.addItemListener(il_resetSubgenreItems);\r
+               \r
+               jButton_load.addActionListener(al_loadAction);\r
+               jButton_save.addActionListener(al_saveAction);\r
+               jButton_savedefault.addActionListener(al_saveDefaultAction);\r
+               \r
+               // 付けたり外したりするリスナー\r
+               setEnabledListenerAll(true);\r
+       }\r
+       \r
+       private void addComponents() {\r
+               \r
+               setLayout(new SpringLayout());\r
+               \r
+               int y = 0;\r
+               int x = SEP_WIDTH_NARROW;\r
+               \r
+               CommonSwingUtils.putComponentOn(this, jCBXPanel_recorder = new JComboBoxPanel("",RECORDER_WIDTH,RECORDER_WIDTH),        RECORDER_WIDTH+5,       COMBO_HEIGHT+SEP_HEIGHT, x, y);\r
+               CommonSwingUtils.putComponentOn(this, jCBXPanel_encoder = new JComboBoxPanel("",ENCODER_WIDTH,ENCODER_WIDTH),           ENCODER_WIDTH+5,        COMBO_HEIGHT+SEP_HEIGHT, x+=RECORDER_WIDTH+5+SEP_WIDTH, y);\r
+               CommonSwingUtils.putComponentOn(this, jLabel_encoderemptywarn = new JLabel(""), LABEL_WIDTH, PARTS_HEIGHT, x+=ENCODER_WIDTH+5+SEP_WIDTH+5, y+PARTS_HEIGHT);\r
+               \r
+               jCBXPanel_recorder.getJComboBox().setForeground(Color.BLUE);\r
+               jCBXPanel_encoder.getJComboBox().setForeground(Color.BLUE);\r
+               \r
+               // ポップアップした時に追加される幅\r
+               jCBXPanel_recorder.addPopupWidth(100);\r
+               jCBXPanel_encoder.addPopupWidth(100);\r
+\r
+               y += (COMBO_HEIGHT+SEP_HEIGHT)+SEP_HEIGHT;\r
+               x = SEP_WIDTH_NARROW;\r
+               CommonSwingUtils.putComponentOn(this, jCBXPanel_genre = new JComboBoxPanel("",110,150),         COMBO_WIDTH_WIDE,       COMBO_HEIGHT, x, y);\r
+               CommonSwingUtils.putComponentOn(this, jCBXPanel_subgenre = new JComboBoxPanel("",110,150),      COMBO_WIDTH_WIDE,       COMBO_HEIGHT, x+=(COMBO_WIDTH_WIDE+SEP_WIDTH), y);\r
+               CommonSwingUtils.putComponentOn(this, jCBXPanel_autodel = new JComboBoxPanel("",110,110),       COMBO_WIDTH,            COMBO_HEIGHT, x+=(COMBO_WIDTH+SEP_WIDTH)*2, y);\r
+               CommonSwingUtils.putComponentOn(this, jCBXPanel_xChapter = new JComboBoxPanel("",110,110),      COMBO_WIDTH,            COMBO_HEIGHT, x+=(COMBO_WIDTH+SEP_WIDTH), y);\r
+               \r
+               y += COMBO_HEIGHT;\r
+               x = SEP_WIDTH_NARROW;\r
+               CommonSwingUtils.putComponentOn(this, jCBXPanel_videorate = new JComboBoxPanel("",110,150),     COMBO_WIDTH_WIDE,       COMBO_HEIGHT, x, y);\r
+               CommonSwingUtils.putComponentOn(this, jCBXPanel_audiorate = new JComboBoxPanel("",110,110),     COMBO_WIDTH,            COMBO_HEIGHT, x+=(COMBO_WIDTH_WIDE+SEP_WIDTH), y);\r
+               CommonSwingUtils.putComponentOn(this, jCBXPanel_bvperf = new JComboBoxPanel("",110,110),        COMBO_WIDTH,            COMBO_HEIGHT, x+=(COMBO_WIDTH+SEP_WIDTH), y);\r
+               CommonSwingUtils.putComponentOn(this, jCBXPanel_lvoice = new JComboBoxPanel("",110,110),        COMBO_WIDTH,            COMBO_HEIGHT, x+=(COMBO_WIDTH+SEP_WIDTH), y);\r
+               CommonSwingUtils.putComponentOn(this, jCBXPanel_msChapter = new JComboBoxPanel("",110,110),     COMBO_WIDTH,            COMBO_HEIGHT, x+=(COMBO_WIDTH+SEP_WIDTH), y);\r
+               \r
+               y += COMBO_HEIGHT;\r
+               x = SEP_WIDTH_NARROW;\r
+               CommonSwingUtils.putComponentOn(this, jCBXPanel_folder = new JComboBoxPanel("",100,150),        COMBO_WIDTH_WIDE,       COMBO_HEIGHT, x, y);\r
+               CommonSwingUtils.putComponentOn(this, jCBXPanel_device = new JComboBoxPanel("",110,110),        COMBO_WIDTH,            COMBO_HEIGHT, x+=(COMBO_WIDTH_WIDE+SEP_WIDTH), y);\r
+               CommonSwingUtils.putComponentOn(this, jCBXPanel_dvdcompat = new JComboBoxPanel("",110,110),     COMBO_WIDTH,            COMBO_HEIGHT, x+=(COMBO_WIDTH+SEP_WIDTH), y);\r
+               CommonSwingUtils.putComponentOn(this, jCBXPanel_aspect = new JComboBoxPanel("",110,110),        COMBO_WIDTH,            COMBO_HEIGHT, x+=(COMBO_WIDTH+SEP_WIDTH), y);\r
+               CommonSwingUtils.putComponentOn(this, jCBXPanel_mvChapter = new JComboBoxPanel("",110,110),     COMBO_WIDTH,            COMBO_HEIGHT, x+=(COMBO_WIDTH+SEP_WIDTH), y);\r
+\r
+               y += COMBO_HEIGHT;\r
+               CommonSwingUtils.putComponentOn(this, jCBXPanel_pursues = new JComboBoxPanel("",110,110),       COMBO_WIDTH,            COMBO_HEIGHT, x, y);\r
+               \r
+               y += COMBO_HEIGHT;\r
+               \r
+               // 特殊配置\r
+               {\r
+                       int spy = SEP_HEIGHT_NALLOW+(PARTS_HEIGHT+SEP_HEIGHT_NALLOW)*2;\r
+                       x = SEP_WIDTH_NARROW+(COMBO_WIDTH_WIDE+SEP_WIDTH)+(COMBO_WIDTH+SEP_WIDTH)*4+SEP_WIDTH;\r
+                       \r
+                       CommonSwingUtils.putComponentOn(this, jLabel_rectype = new JLabel("ジャンル別の"), LABEL_WIDTH, PARTS_HEIGHT, x, spy);\r
+                       \r
+                       spy+=PARTS_HEIGHT-5;\r
+                       \r
+                       CommonSwingUtils.putComponentOn(this, new JLabel("録画設定の選択"),      LABEL_WIDTH,  PARTS_HEIGHT, x, spy);\r
+                       CommonSwingUtils.putComponentOn(this, jButton_load = new JButton("開く"),                             BUTTON_WIDTH, PARTS_HEIGHT, x+SEP_WIDTH_NARROW, spy+=PARTS_HEIGHT);\r
+                       CommonSwingUtils.putComponentOn(this, jButton_save = new JButton("保存"),                     BUTTON_WIDTH, PARTS_HEIGHT, x+SEP_WIDTH_NARROW, spy+=PARTS_HEIGHT);\r
+                       CommonSwingUtils.putComponentOn(this, jButton_savedefault = new JButton("既定化"),   BUTTON_WIDTH, PARTS_HEIGHT, x+SEP_WIDTH_NARROW, spy+=(PARTS_HEIGHT+SEP_HEIGHT));\r
+                       \r
+                       jButton_savedefault.setToolTipText(TEXT_SAVEDEFAULT);\r
+                       \r
+                       CommonSwingUtils.putComponentOn(this, jCheckBox_Exec = new JCheckBoxPanel("予約実行",75,true), 75, PARTS_HEIGHT, x+SEP_WIDTH_NARROW, spy+=(PARTS_HEIGHT+SEP_HEIGHT));\r
+                       setExecValue(true);\r
+               }\r
+               \r
+               x+=BUTTON_WIDTH+SEP_WIDTH_NARROW*2;\r
+               \r
+               Dimension d = new Dimension(x,y);\r
+               setPreferredSize(d);\r
+       }\r
+       \r
+       public void setRecSettingSelector(RecSettingSelectable o) {\r
+               recsetsel = o;\r
+       }\r
+       \r
+       \r
+       /*******************************************************************************\r
+        * アイテムの設定\r
+        ******************************************************************************/\r
+       \r
+       /***************************************\r
+        * 項目ラベルの設定\r
+        **************************************/\r
+       \r
+       /**\r
+        * レコーダが選択されたら各コンポーネントラベルを設定する\r
+        * @param recorder\r
+        */\r
+       public void setLabels(HDDRecorder recorder) {\r
+               \r
+               // 固定ラベル\r
+               setLabel(jCBXPanel_recorder,    null,                                                   "レコーダ");\r
+               setLabel(jCBXPanel_encoder,             null,                                                   "エンコーダ");\r
+               setLabel(jCBXPanel_genre,               null,                                                   "ジャンル");\r
+               setLabel(jCBXPanel_subgenre,    null,                                                   "サブジャンル");\r
+               setLabel(jCBXPanel_pursues,             null,                                                   "番組追従");\r
+               \r
+               // 可変ラベル\r
+               setLabel(jCBXPanel_videorate,   recorder.getLabel_Videorate(),  "画質");\r
+               setLabel(jCBXPanel_audiorate,   recorder.getLabel_Audiorate(),  "音質");\r
+               \r
+               setLabel(jCBXPanel_folder,              recorder.getLabel_Folder(),             "記録先フォルダ");\r
+               setLabel(jCBXPanel_device,              recorder.getLabel_Device(),             "記録先デバイス");\r
+               \r
+               setLabel(jCBXPanel_bvperf,              recorder.getLabel_BVperf(),             "録画優先度");             // "高レート節約"?\r
+               setLabel(jCBXPanel_dvdcompat,   recorder.getLabel_DVDCompat(),  "BD/DVD互換モード");\r
+               \r
+               setLabel(jCBXPanel_autodel,             recorder.getLabel_Autodel(),    "自動削除");\r
+               setLabel(jCBXPanel_lvoice,              recorder.getLabel_LVoice(),             "ライン音声選択");\r
+               setLabel(jCBXPanel_aspect,              recorder.getLabel_Aspect(),             "録画のりしろ");          // "DVD記録時画面比"?\r
+               \r
+               setLabel(jCBXPanel_msChapter,   recorder.getLabel_MsChapter(),  "マジックチャプタ(シーン)");   // "DVD/シーンチャプタ分割"?\r
+               setLabel(jCBXPanel_mvChapter,   recorder.getLabel_MvChapter(),  "マジックチャプタ(本編)");      // "音多/本編チャプタ分割"?\r
+               setLabel(jCBXPanel_xChapter,    recorder.getLabel_XChapter(),   "無音部分チャプタ分割");\r
+       }\r
+\r
+       /**\r
+        * ジャンル別AV設定か、CH別AV設定かを選ぶ\r
+        */\r
+       public void setAVCHSetting(boolean enabled) {\r
+               jLabel_rectype.setText(enabled ? "放送局別の" : "ジャンル別の");\r
+       }\r
+       \r
+       /***************************************\r
+        * 固定アイテムの設定\r
+        **************************************/\r
+       \r
+       /**\r
+        * 固定のアイテムを設定する\r
+        * @see #setFlexItems(HDDRecorder, String)\r
+        */\r
+       public void setFixedItems(HDDRecorderList recorders) {\r
+               \r
+               setEnabledListenerAll(false);   // リスナー停止\r
+               \r
+               setRecorderItems(recorders);\r
+               \r
+               setEnabledListenerAll(true);    // リスナー再開\r
+       }\r
+       \r
+       /**\r
+        * レコーダアイテムを設定する\r
+        * @see #setFixedItems(HDDRecorderList)\r
+        */\r
+       private void setRecorderItems(HDDRecorderList recorders) {\r
+               String selected = (String) jCBXPanel_recorder.getSelectedItem();\r
+               ArrayList<String> items = new ArrayList<String>();\r
+               for ( HDDRecorder rec : recorders ) {\r
+                       if ( rec.isBackgroundOnly() ) {\r
+                               continue;       // Googleカレンダープラグインとかははずす\r
+                       }\r
+                       items.add(rec.Myself());\r
+               }\r
+               \r
+               setComboItems(jCBXPanel_recorder, items);\r
+               \r
+               if ( selected != null ) {\r
+                       // 入れ替え後に元に戻してみる\r
+                       jCBXPanel_recorder.setSelectedItem(selected);\r
+               }\r
+       }\r
+       \r
+       /**\r
+        * ジャンルアイテムを設定する\r
+        * @see #setFixedItems(HDDRecorderList)\r
+        */\r
+       private void setGenreItems() {\r
+               ArrayList<String> items = new ArrayList<String>();\r
+               for ( ProgGenre g : ProgGenre.values() ) {\r
+                       items.add(g.toString());\r
+               }\r
+               \r
+               setComboItems(jCBXPanel_genre, items);\r
+       }\r
+       \r
+       \r
+       /***************************************\r
+        * 可変アイテムの設定\r
+        **************************************/\r
+       \r
+       /**\r
+        * レコーダが選択されたらそれにあわせて各コンポーネントアイテムを設定する\r
+        */\r
+       public void setFlexItems(HDDRecorder recorder, String webChName) {\r
+               \r
+               setEnabledListenerAll(false);   // リスナー停止 \r
+               \r
+               // エンコーダ\r
+               setComboItems(jCBXPanel_encoder, recorder.getFilteredEncoders(webChName));\r
+               \r
+               // 設定値\r
+               setComboItems(jCBXPanel_videorate, recorder.getVideoRateList());\r
+               setComboItems(jCBXPanel_audiorate, recorder.getAudioRateList());\r
+               setComboItems(jCBXPanel_folder, recorder.getFolderList());\r
+               \r
+               setComboItems(jCBXPanel_device, recorder.getDeviceList());\r
+               setComboItems(jCBXPanel_bvperf, recorder.getBVperf());\r
+               setComboItems(jCBXPanel_dvdcompat, recorder.getDVDCompatList());\r
+               \r
+               setComboItems(jCBXPanel_autodel, recorder.getAutodel());\r
+               setComboItems(jCBXPanel_lvoice, recorder.getLVoice());\r
+               setComboItems(jCBXPanel_aspect, recorder.getAspect());\r
+               \r
+               setComboItems(jCBXPanel_msChapter, recorder.getMsChapter());\r
+               setComboItems(jCBXPanel_mvChapter, recorder.getMvChapter());\r
+               setComboItems(jCBXPanel_xChapter, recorder.getXChapter());\r
+\r
+               setComboItems(jCBXPanel_pursues, null);\r
+               \r
+               setEnabledListenerAll(true);    // リスナー再開\r
+       }\r
+       \r
+       /**\r
+        * ジャンルが選択されたらそれにあわせてサブジャンルアイテムを設定する\r
+        * @see #setGenreItems()\r
+        */\r
+       private void setSubgenreItems(ProgGenre genre) {\r
+               ArrayList<String> items = new ArrayList<String>();\r
+               for ( ProgSubgenre sg : ProgSubgenre.values(genre) ) {\r
+                       items.add(sg.toString());\r
+               }\r
+               \r
+               setComboItems(jCBXPanel_subgenre, items);\r
+       }\r
+       \r
+       \r
+       /*******************************************************************************\r
+        * 共通部品的な\r
+        ******************************************************************************/\r
+\r
+       /**\r
+        * コンボボックスのアイテム登録を行う\r
+        */\r
+       private <T> int setComboItems(JComboBoxPanel combo, ArrayList<T> items) {\r
+               combo.removeAllItems();\r
+               \r
+               if ( items == null ) {\r
+                       // ここにくるのは番組追従のみかな?\r
+                       combo.addItem(ITEM_YES);\r
+                       combo.addItem(ITEM_NO);\r
+                       combo.setEnabled(true);\r
+                       return combo.getItemCount();\r
+               }\r
+\r
+               if ( items.size() == 0 ) {\r
+                       combo.setEnabled(false);\r
+                       return 0;\r
+               }\r
+       \r
+               // うひー\r
+               for ( T enc : items ) {\r
+                       if ( enc.getClass() == TextValueSet.class ) {\r
+                               TextValueSet t = (TextValueSet) enc;\r
+                               combo.addItem(t.getText());\r
+                               \r
+                               if (t.getDefval()) combo.setSelectedIndex(combo.getItemCount()-1);      // デフォルト値があるならば\r
+                       }\r
+                       else if ( enc.getClass() == String.class ) {\r
+                               // レコーダ・エンコーダのみかな?\r
+                               combo.addItem((String) enc);\r
+                       }\r
+               }\r
+               combo.setEnabled(combo.getItemCount() > 1);\r
+               return combo.getItemCount();\r
+       }\r
+\r
+       private void setLabel(JComboBoxPanel combo, String overrideLabel, String defaultLabel) {\r
+               combo.setText((overrideLabel!=null)?overrideLabel:defaultLabel);\r
+       }\r
+       \r
+       /*******************************************************************************\r
+        * 外部とのやり取り(設定反映系)\r
+        ******************************************************************************/\r
+\r
+       /***************************************\r
+        * 設定の一括反映3種\r
+        **************************************/\r
+       \r
+       /**\r
+        * 番組情報によるアイテム選択\r
+        */\r
+       public void setSelectedValues(ProgDetailList tvd, ReserveList r) {\r
+               \r
+               setEnabledListenerAll(false);\r
+               \r
+               // サブジャンルアイテム群はジャンル決定後に埋まる\r
+               setSelectedGenreValues((tvd.genre!=null?tvd.genre.toString():null), (tvd.subgenre!=null?tvd.subgenre.toString():null));\r
+               \r
+               // チューナー\r
+               setSelectedEncoderValue(r.getTuner());  // encがnullかどうかはメソッドの中で確認するよ\r
+               \r
+               // 画質・音質\r
+               setSelectedValue(jCBXPanel_videorate, r.getRec_mode());\r
+               setSelectedValue(jCBXPanel_audiorate, r.getRec_audio());\r
+               setSelectedValue(jCBXPanel_folder, r.getRec_folder());\r
+               // サブジャンルは番組情報から\r
+               setSelectedValue(jCBXPanel_dvdcompat, r.getRec_dvdcompat());\r
+               setSelectedValue(jCBXPanel_device, r.getRec_device());\r
+               \r
+               // 自動チャプタ関連\r
+               setSelectedValue(jCBXPanel_xChapter, r.getRec_xchapter());\r
+               setSelectedValue(jCBXPanel_msChapter, r.getRec_mschapter());\r
+               setSelectedValue(jCBXPanel_mvChapter, r.getRec_mvchapter());\r
+               \r
+               // その他\r
+               setSelectedValue(jCBXPanel_aspect, r.getRec_aspect());\r
+               setSelectedValue(jCBXPanel_bvperf, r.getRec_bvperf());\r
+               setSelectedValue(jCBXPanel_lvoice, r.getRec_lvoice());\r
+               setSelectedValue(jCBXPanel_autodel, r.getRec_autodel());\r
+               \r
+               // 番組追従\r
+               setSelectedValue(jCBXPanel_pursues, r.getPursues() ? ITEM_YES : ITEM_NO);\r
+               \r
+               // 実行ON・OFF\r
+               setExecValue(r.getExec());\r
+               \r
+               setEnabledListenerAll(true);\r
+       }\r
+       \r
+       /**\r
+        * 類似予約情報によるアイテム選択\r
+        */\r
+       public void setSelectedValues(ReserveList r) {\r
+\r
+               setEnabledListenerAll(false);\r
+\r
+               // サブジャンルアイテム群はジャンル決定後に埋まる\r
+               setSelectedGenreValues(r.getRec_genre(), r.getRec_genre());\r
+\r
+               // チューナー\r
+               setSelectedValue(jCBXPanel_encoder, r.getTuner());\r
+               \r
+               // 画質・音質\r
+               setSelectedValue(jCBXPanel_videorate, r.getRec_mode());\r
+               setSelectedValue(jCBXPanel_audiorate, r.getRec_audio());\r
+               setSelectedValue(jCBXPanel_folder, r.getRec_folder());\r
+               setSelectedValue(jCBXPanel_subgenre, r.getRec_subgenre());\r
+               setSelectedValue(jCBXPanel_dvdcompat, r.getRec_dvdcompat());\r
+               setSelectedValue(jCBXPanel_device, r.getRec_device());\r
+               \r
+               // 自動チャプタ関連\r
+               setSelectedValue(jCBXPanel_xChapter, r.getRec_xchapter());\r
+               setSelectedValue(jCBXPanel_msChapter, r.getRec_mschapter());\r
+               setSelectedValue(jCBXPanel_mvChapter, r.getRec_mvchapter());\r
+               \r
+               // その他\r
+               setSelectedValue(jCBXPanel_aspect, r.getRec_aspect());\r
+               setSelectedValue(jCBXPanel_bvperf, r.getRec_bvperf());\r
+               setSelectedValue(jCBXPanel_lvoice, r.getRec_lvoice());\r
+               setSelectedValue(jCBXPanel_autodel, r.getRec_autodel());\r
+               \r
+               // 番組追従\r
+               setSelectedValue(jCBXPanel_pursues, r.getPursues() ? ITEM_YES : ITEM_NO);\r
+               \r
+               // 実行ON・OFF\r
+               setExecValue(r.getExec());\r
+               \r
+               setEnabledListenerAll(true);\r
+       }\r
+       \r
+       /**\r
+        * ジャンル別AV設定によるアイテム選択\r
+        */\r
+       public void setSelectedValues(AVs avs) {\r
+               \r
+               setEnabledListenerAll(false);\r
+               \r
+               // 画質・音質\r
+               setSelectedValue(jCBXPanel_videorate, avs.getVideorate());\r
+               setSelectedValue(jCBXPanel_audiorate, avs.getAudiorate());\r
+               setSelectedValue(jCBXPanel_folder, avs.getFolder());\r
+               // サブジャンルは確定済み\r
+               setSelectedValue(jCBXPanel_dvdcompat, avs.getDVDCompat());\r
+               setSelectedValue(jCBXPanel_device, avs.getDevice());\r
+               \r
+               // 自動チャプタ関連\r
+               setSelectedValue(jCBXPanel_xChapter, avs.getXChapter());\r
+               setSelectedValue(jCBXPanel_msChapter, avs.getMsChapter());\r
+               setSelectedValue(jCBXPanel_mvChapter, avs.getMvChapter());\r
+               \r
+               // その他\r
+               setSelectedValue(jCBXPanel_aspect, avs.getAspect());\r
+               setSelectedValue(jCBXPanel_bvperf, avs.getBvperf());\r
+               setSelectedValue(jCBXPanel_lvoice, avs.getLvoice());\r
+               setSelectedValue(jCBXPanel_autodel, avs.getAutodel());\r
+               \r
+               setEnabledListenerAll(true);\r
+       }\r
+       \r
+       /***************************************\r
+        * 設定の部分反映各種 \r
+        **************************************/\r
+       \r
+       /**\r
+        * 実行ON・OFFの強制設定\r
+        */\r
+       public void setExecValue(boolean b) {\r
+               jCheckBox_Exec.setSelected(b);\r
+               jCheckBox_Exec.setForeground(b ? Color.BLACK : Color.RED);\r
+       }\r
+       \r
+       /**\r
+        * レコーダのアイテム選択(中から呼んじゃだめだよ)\r
+        */\r
+       public String setSelectedRecorderValue(String myself) {\r
+               setEnabledListenerAll(false);\r
+               \r
+               String selected = setSelectedValue(jCBXPanel_recorder, myself);\r
+               \r
+               setEnabledListenerAll(true);\r
+               return selected;\r
+       }\r
+       \r
+       /**\r
+        * エンコーダのアイテム選択\r
+        */\r
+       private String setSelectedEncoderValue(String enc) {\r
+               if ( enc == null ) {\r
+                       jCBXPanel_encoder.setSelectedIndex(0);\r
+                       jLabel_encoderemptywarn.setText("空きエンコーダ検索無効");\r
+                       jLabel_encoderemptywarn.setForeground(Color.CYAN);\r
+               }\r
+               else if ( enc.length() == 0 ) {\r
+                       jCBXPanel_encoder.setSelectedIndex(0);\r
+                       jLabel_encoderemptywarn.setText("空きエンコーダ不足");\r
+                       jLabel_encoderemptywarn.setForeground(Color.RED);\r
+               }\r
+               else {\r
+                       jCBXPanel_encoder.setSelectedItem(enc);\r
+                       jLabel_encoderemptywarn.setText("空きエンコーダあり");\r
+                       jLabel_encoderemptywarn.setForeground(Color.BLUE);\r
+               }\r
+               \r
+               return (String) jCBXPanel_encoder.getSelectedItem();\r
+       }\r
+       \r
+       /**\r
+        * ジャンルアイテムの選択\r
+        */\r
+       private String setSelectedGenreValues(String genre, String subgenre) {\r
+               if ( genre == null || genre.length() == 0 ) {\r
+                       genre = ProgGenre.NOGENRE.toString();\r
+               }\r
+               jCBXPanel_genre.setSelectedItem(genre);\r
+               \r
+               if ( subgenre == null || subgenre.length() == 0 ) {\r
+                       jCBXPanel_subgenre.setSelectedIndex(0);\r
+               }\r
+               else {\r
+                       jCBXPanel_subgenre.setSelectedItem(subgenre);\r
+               }\r
+               \r
+               return (String) jCBXPanel_genre.getSelectedItem();\r
+       }\r
+       \r
+       /**\r
+        * アイテム選択\r
+        */\r
+       private String setSelectedValue(JComboBoxPanel comp, String value) {\r
+               if ( value != null ) {\r
+                       comp.setSelectedItem(value);\r
+               }\r
+               else if ( comp.getItemCount() > 0 ){\r
+                       comp.setSelectedIndex(0);\r
+               }\r
+               return (String) comp.getSelectedItem();\r
+       }\r
+       \r
+       /*******************************************************************************\r
+        * 外部とのやり取り(設定取得系)\r
+        ******************************************************************************/\r
+       \r
+       /***************************************\r
+        * 取得系\r
+        **************************************/\r
+       \r
+       /**\r
+        * 選択中のレコーダを返す\r
+        */\r
+       public String getSelectedRecorder() {\r
+               return (String) jCBXPanel_recorder.getSelectedItem();\r
+       }\r
+       \r
+       /**\r
+        * 選択値を予約情報に代入する\r
+        */\r
+       public ReserveList getSelectedValues(ReserveList r) {\r
+               \r
+               r.setTuner((String) jCBXPanel_encoder.getSelectedItem());\r
+               \r
+               r.setRec_mode((String) jCBXPanel_videorate.getSelectedItem());\r
+               r.setRec_audio((String) jCBXPanel_audiorate.getSelectedItem());\r
+               r.setRec_folder((String) jCBXPanel_folder.getSelectedItem());\r
+               r.setRec_genre((String) jCBXPanel_genre.getSelectedItem());\r
+               r.setRec_subgenre((String) jCBXPanel_subgenre.getSelectedItem());\r
+               r.setRec_dvdcompat((String) jCBXPanel_dvdcompat.getSelectedItem());\r
+               r.setRec_device((String) jCBXPanel_device.getSelectedItem());\r
+               \r
+               // 自動チャプタ関連\r
+               r.setRec_xchapter((String) jCBXPanel_xChapter.getSelectedItem());\r
+               r.setRec_mschapter((String) jCBXPanel_msChapter.getSelectedItem());\r
+               r.setRec_mvchapter((String) jCBXPanel_mvChapter.getSelectedItem());\r
+               \r
+               // その他\r
+               r.setRec_aspect((String) jCBXPanel_aspect.getSelectedItem());\r
+               r.setRec_bvperf((String) jCBXPanel_bvperf.getSelectedItem());\r
+               r.setRec_lvoice((String) jCBXPanel_lvoice.getSelectedItem());\r
+               r.setRec_autodel((String) jCBXPanel_autodel.getSelectedItem());\r
+               \r
+               // 番組追従\r
+               r.setPursues(ITEM_YES == jCBXPanel_pursues.getSelectedItem());\r
+               \r
+               // 実行ON・OFF\r
+               r.setExec(jCheckBox_Exec.isSelected());\r
+               \r
+               return r;\r
+       }\r
+       \r
+       /**\r
+        * 選択値をジャンル別録画設定情報に代入する\r
+        */\r
+       public AVs getSelectedSetting(AVs c) {\r
+\r
+               c.setVideorate((String) jCBXPanel_videorate.getSelectedItem());\r
+               c.setAudiorate((String) jCBXPanel_audiorate.getSelectedItem());\r
+               c.setFolder((String) jCBXPanel_folder.getSelectedItem());\r
+               c.setDVDCompat((String) jCBXPanel_dvdcompat.getSelectedItem());\r
+               c.setDevice((String) jCBXPanel_device.getSelectedItem());\r
+               \r
+               c.setXChapter((String) jCBXPanel_xChapter.getSelectedItem());\r
+               c.setMsChapter((String) jCBXPanel_msChapter.getSelectedItem());\r
+               c.setMvChapter((String) jCBXPanel_mvChapter.getSelectedItem());\r
+               \r
+               c.setAspect((String) jCBXPanel_aspect.getSelectedItem());\r
+               c.setBvperf((String) jCBXPanel_bvperf.getSelectedItem());\r
+               c.setLvoice((String) jCBXPanel_lvoice.getSelectedItem());\r
+               c.setAutodel((String) jCBXPanel_autodel.getSelectedItem());\r
+               \r
+               c.setPursues(ITEM_YES == jCBXPanel_pursues.getSelectedItem());\r
+               \r
+               return c;\r
+       }\r
+       \r
+       \r
+       /*******************************************************************************\r
+        * リスナー\r
+        ******************************************************************************/\r
+       \r
+       /***************************************\r
+        * 永続的なリスナー\r
+        **************************************/\r
+       \r
+       private final ItemListener il_resetSubgenreItems = 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 al_loadAction = new ActionListener() {\r
+               public void actionPerformed(ActionEvent e) {\r
+/*\r
+                       ProgGenre key_genre = ProgGenre.get(jPane_recsetting.getSelectedGenre());\r
+                       String key_webChName = (String) jComboBox_ch.getSelectedItem();\r
+                       String recId = recorders.findInstance(jPane_recsetting.getSelectedRecorder()).get(0).getRecorderId();\r
+                       setSelectedAVItems(recId, null, getSelectedAVs(key_genre, key_webChName, recId));\r
+                       MWin.appendMessage(MSGID+"画質・音質等の設定を取得しました");\r
+*/\r
+               }\r
+       };\r
+       \r
+       /**\r
+        * ジャンル別AV設定のセーブ\r
+        */\r
+       private final ActionListener al_saveAction = new ActionListener() {\r
+               public void actionPerformed(ActionEvent e) {\r
+/*\r
+                       Matcher ma = Pattern.compile("^.+?:.+?:(.+?)$").matcher(jPane_recsetting.getSelectedRecorder());\r
+                       if (ma.find()) {\r
+                               if (env.getEnableCHAVsetting()) {\r
+                                       String key_webChName = (String) jComboBox_ch.getSelectedItem();\r
+                                       _save_avsettings(ma.group(1),key_webChName);\r
+                               }\r
+                               else {\r
+                                       String key_genre = jPane_recsetting.getSelectedGenre();\r
+                                       _save_avsettings(ma.group(1),key_genre);\r
+                               }\r
+                       }\r
+*/\r
+               }\r
+       };\r
+       \r
+       /**\r
+        * 既定AV設定のセーブ\r
+        */\r
+       private final ActionListener al_saveDefaultAction = new ActionListener() {\r
+               public void actionPerformed(ActionEvent e) {\r
+                       /*\r
+                       Matcher ma = Pattern.compile("^.+?:.+?:(.+?)$").matcher(jPane_recsetting.getSelectedRecorder());\r
+                       if (ma.find()) {\r
+                               _save_avsettings(ma.group(1),null);\r
+                       }\r
+                       */\r
+               }\r
+       };\r
+       \r
+\r
+       /***************************************\r
+        * つけたり外したりするリスナーをつけたり外したりするメソッド\r
+        **************************************/\r
+       \r
+       /**\r
+        * イベントトリガーでアイテムを操作する際に、さらにイベントをキックされてはたまらないのでリスナーを付けたり外したりする\r
+        */\r
+       private void setEnabledListenerAll(boolean enabled) {\r
+\r
+               // あとで削除\r
+               if ( debug ) {\r
+                       if ( enabled ) {\r
+                               Object o = null;\r
+                               for ( ItemListener il : jCBXPanel_recorder.getJComboBox().getItemListeners() ) {\r
+                                       if ( il == il_recorderChanged ) {\r
+                                               System.out.println(DBGID+"****** リスナーの重複登録 ******");\r
+                                               //CommonUtils.printStackTrace();\r
+                                               o = il;\r
+                                               break;\r
+                                       }\r
+                               }\r
+                               if ( o == null ) {\r
+                                       System.out.println("+++ リスナーの登録 +++");\r
+                                       //CommonUtils.printStackTrace();\r
+                               }\r
+                       }\r
+                       else {\r
+                               System.out.println("... リスナーの削除 ...");\r
+                       }\r
+               }\r
+               \r
+               setEnabledItemListener(jCBXPanel_recorder, il_recorderChanged, enabled);\r
+               setEnabledItemListener(jCBXPanel_encoder, il_encoderChanged, enabled);\r
+               setEnabledItemListener(jCBXPanel_genre, il_genreChanged, enabled);\r
+       }\r
+       private void setEnabledItemListener(ItemSelectable comp, ItemListener il, boolean b) {\r
+               comp.removeItemListener(il);\r
+               if ( b ) {\r
+                       comp.addItemListener(il);\r
+               }\r
+       }\r
+       \r
+       /***************************************\r
+        * つけたり外したりするリスナー群 \r
+        **************************************/\r
+       \r
+       /**\r
+        *  レコーダーが選択された\r
+        */\r
+       private final ItemListener il_recorderChanged = new ItemListener() {\r
+               @Override\r
+               public void itemStateChanged(ItemEvent e) {\r
+                       if ( e.getStateChange() != ItemEvent.SELECTED ) {\r
+                               return;\r
+                       }\r
+                       \r
+                       if ( recsetsel != null ) {\r
+                               setEnabledListenerAll(false);   // 停止\r
+                               \r
+                               recsetsel.doSelectRecorder((String) jCBXPanel_recorder.getSelectedItem());\r
+                               \r
+                               setEnabledListenerAll(true);    // 再開\r
+                       }\r
+               }\r
+       };\r
+       \r
+       /**\r
+        *  エンコーダが選択された(ので利用可能な画質を選びなおす)\r
+        */\r
+       private final ItemListener il_encoderChanged = new ItemListener() {\r
+               @Override\r
+               public void itemStateChanged(ItemEvent e) {\r
+                       if ( e.getStateChange() != ItemEvent.SELECTED ) {\r
+                               return;\r
+                       }\r
+\r
+                       String myself = (String) jCBXPanel_recorder.getSelectedItem();\r
+                       if ( ! isVARDIA(myself) ) {\r
+                               return;\r
+                       }\r
+                       \r
+                       String encoder = (String) jCBXPanel_encoder.getSelectedItem();\r
+                       if ( encoder == null ) {\r
+                               return;\r
+                       }\r
+\r
+                       if ( encoder.startsWith("TS") ) {\r
+                               // TS1/2では画質に[TS]系列を選ぶ\r
+                               setSelectedVrateByEncoderChanged("[TS]",null);\r
+                       }\r
+                       else if ( encoder.startsWith("DR") ) {\r
+                               // DR1/2では画質に[DR]を選ぶ\r
+                               setSelectedVrateByEncoderChanged("[DR]",null);\r
+                       }\r
+                       else if ( encoder.startsWith("RE") ) {\r
+                               // REでは画質に[TSE]または[AVC]系列を選ぶ\r
+                               setSelectedVrateByEncoderChanged("[TSE] ","[AVC] ");\r
+                       }\r
+               }\r
+       };\r
+       \r
+       /**\r
+        * エンコーダに連動して画質を変える(RD系)\r
+        */\r
+       private void setSelectedVrateByEncoderChanged(String vrate1, String vrate2) {\r
+               for ( int i=0; i<jCBXPanel_videorate.getItemCount(); i++ ) {\r
+                       String vrate = (String) jCBXPanel_videorate.getItemAt(i);\r
+                       if ( vrate1 != null && vrate.startsWith(vrate1) ) {\r
+                               jCBXPanel_videorate.setSelectedIndex(i);\r
+                               return;\r
+                       }\r
+                       if ( vrate2 != null && vrate.startsWith(vrate2) ) {\r
+                               jCBXPanel_videorate.setSelectedIndex(i);\r
+                               return;\r
+                       }\r
+               }\r
+       }\r
+\r
+       /**\r
+        * VARDIA・REGZA RDかどうか調べる\r
+        */\r
+       private boolean isVARDIA( String myself ) {\r
+               return (myself != null && (myself.startsWith("VARDIA RD-") || myself.startsWith("REGZA RD-"))) ;\r
+       }\r
+       \r
+       // RDかどうか調べる\r
+       private boolean isRD( String myrecid ) {\r
+               return ( myrecid.startsWith("RD-") || myrecid.startsWith("VARDIA RD-") || myrecid.startsWith("REGZA RD-") || myrecid.startsWith("REGZA DBR-Z") ) ;\r
+       }\r
+       \r
+\r
+       private final ItemListener il_genreChanged = new ItemListener() {\r
+               @Override\r
+               public void itemStateChanged(ItemEvent e) {\r
+                       if (e.getStateChange() != ItemEvent.SELECTED) {\r
+                               return;\r
+                       }\r
+                       setSubgenreItems(ProgGenre.get((String) jCBXPanel_genre.getSelectedItem()));\r
+               }\r
+       };\r
+       \r
+       \r
+       /*******************************************************************************\r
+        * コンポーネント\r
+        ******************************************************************************/\r
+\r
+       // あれ?getJXX()が一個もないよ!\r
+       \r
+}\r
diff --git a/TinyBannavi/src/tainavi/RecSettingSelectable.java b/TinyBannavi/src/tainavi/RecSettingSelectable.java
new file mode 100644 (file)
index 0000000..8cb9b43
--- /dev/null
@@ -0,0 +1,10 @@
+package tainavi;\r
+\r
+public interface RecSettingSelectable {\r
+\r
+       /**\r
+        * レコーダを選択したのでアイテムをリセットしてほしい\r
+        */\r
+       public void doSelectRecorder(String myself);\r
+       \r
+}\r
diff --git a/TinyBannavi/src/tainavi/RecordExecutable.java b/TinyBannavi/src/tainavi/RecordExecutable.java
new file mode 100644 (file)
index 0000000..b563c19
--- /dev/null
@@ -0,0 +1,25 @@
+package tainavi;\r
+\r
+public interface RecordExecutable {\r
+\r
+       /**\r
+        * 新規登録を行う\r
+        */\r
+       public void doRecord();\r
+       \r
+       /**\r
+        * 更新を行う\r
+        */\r
+       public void doUpdate();\r
+       \r
+       /**\r
+        * ダイアログを閉じる\r
+        */\r
+       public void doCancel();\r
+       \r
+       /**\r
+        * 番組IDを取得する\r
+        */\r
+       public String doGetEventId();\r
+       \r
+}\r
diff --git a/TinyBannavi/src/tainavi/TitleEditorPanel.java b/TinyBannavi/src/tainavi/TitleEditorPanel.java
new file mode 100644 (file)
index 0000000..bc67195
--- /dev/null
@@ -0,0 +1,1116 @@
+package tainavi;\r
+\r
+import java.awt.Color;\r
+import java.awt.Dimension;\r
+import java.awt.event.ActionEvent;\r
+import java.awt.event.ActionListener;\r
+import java.awt.event.ItemEvent;\r
+import java.awt.event.ItemListener;\r
+import java.util.Calendar;\r
+import java.util.GregorianCalendar;\r
+\r
+import javax.swing.JButton;\r
+import javax.swing.JComboBox;\r
+import javax.swing.JLabel;\r
+import javax.swing.JPanel;\r
+import javax.swing.JScrollPane;\r
+import javax.swing.JTextArea;\r
+import javax.swing.JTextField;\r
+import javax.swing.SpringLayout;\r
+import javax.swing.border.LineBorder;\r
+\r
+\r
+/**\r
+ * 予約ダイアログを目的ごとに3ブロックにわけたうちの「番組情報」部分のコンポーネント\r
+ * @since 3.22.2β\r
+ */\r
+public class TitleEditorPanel extends JPanel {\r
+\r
+       private static final long serialVersionUID = 1L;\r
+\r
+       /*******************************************************************************\r
+        * 定数\r
+        ******************************************************************************/\r
+\r
+       //\r
+       private static final String ITEM_EVIDNEEDED = "番組ID取得";\r
+       \r
+       // レイアウト関連\r
+       private static final int PARTS_HEIGHT = 25;\r
+       private static final int SEP_WIDTH = 10;\r
+       private static final int SEP_WIDTH_NARROW = 5;\r
+       private static final int SEP_HEIGHT = 10;\r
+       private static final int SEP_HEIGHT_NALLOW = 5;\r
+       \r
+       private static final int COMBO_WIDTH = 115;\r
+       private static final int COMBO_WIDTH_WIDE = 155;\r
+       private static final int COMBO_HEIGHT = 43;\r
+\r
+       private static final int TITLE_WIDTH = COMBO_WIDTH_WIDE+COMBO_WIDTH*2+SEP_WIDTH*2;\r
+       private static final int CHNAME_WIDTH = COMBO_WIDTH*2+SEP_WIDTH;\r
+       private static final int DETAIL_WIDTH = TITLE_WIDTH+CHNAME_WIDTH+SEP_WIDTH;\r
+       private static final int DETAIL_HEIGHT = 100;\r
+       private static final int DATE_WIDTH = 175;\r
+       \r
+       private static final int HOUR_WIDTH = 50;\r
+       \r
+       \r
+       private static final int LABEL_WIDTH = 150;\r
+       private static final int BUTTON_WIDTH = 75;\r
+\r
+       \r
+       /*******************************************************************************\r
+        * コンポーネント\r
+        ******************************************************************************/\r
+       \r
+       private JLabel jLabel_title = null;\r
+       private JButton jButton_getEventId = null;\r
+       private JTXTLabel jLabel_eventId = null;\r
+       private JButton jButton_addDate = null;\r
+       private JComboBoxWithPopup jComboBox_title = null;\r
+       private JLabel jLabel_ch = null;\r
+       private JWideComboBox jComboBox_ch = null;\r
+       \r
+       private JLabel jLabel_date = null;\r
+       private JComboBox jComboBox_date = null;\r
+       \r
+       private JLabel jLabel_aTime = null;\r
+       private JComboBoxWithPopup jComboBox_ahh = null;\r
+       private JLabel jLabel_asep = null;\r
+       private JComboBoxWithPopup jComboBox_amm = null;\r
+       private JButton jButton_amm_up = null;\r
+       private JButton jButton_amm_down = null;\r
+       \r
+       private JLabel jLabel_zTime = null;\r
+       private JComboBoxWithPopup jComboBox_zhh = null;\r
+       private JLabel jLabel_zsep = null;\r
+       private JComboBoxWithPopup jComboBox_zmm = null;\r
+       private JButton jButton_zmm_up = null;\r
+       private JButton jButton_zmm_down = null;\r
+       \r
+       private JLabel jLabel_recmin = null;\r
+       \r
+       private JLabel jLabel_detail = null;\r
+       private JScrollPane jScrollPane_detail = null;\r
+       private JTextAreaWithPopup jTextArea_detail = null;\r
+       \r
+       private JCheckBoxPanel jCheckBox_OverlapDown2 = null;\r
+       private JCheckBoxPanel jCheckBox_spoex_extend = null;\r
+       \r
+       private JCheckBoxPanel jCheckBox_Autocomplete = null;\r
+\r
+       private JButton jButton_update = null;\r
+       private JButton jButton_record = null;\r
+       private JButton jButton_cancel = null;\r
+       \r
+\r
+       /*******************************************************************************\r
+        * 部品\r
+        ******************************************************************************/\r
+\r
+       private RecordExecutable recexec = null;\r
+       \r
+       TimeVal tVal = null;\r
+       \r
+       public static class TimeVal {\r
+               String date = null;\r
+               Integer ahh = null;\r
+               Integer amm = null;\r
+               Integer zhh = null;\r
+               Integer zmm = null;\r
+               \r
+               String startDateTime = null; \r
+               String endDateTime = null; \r
+                               \r
+               Boolean margined = null;        // 開始時間前倒し\r
+               Boolean clipped = null; // 終了時間短縮\r
+               \r
+               Boolean spoex = null;\r
+               int spoexlen = 0;\r
+       }\r
+       \r
+       \r
+       /*******************************************************************************\r
+        * コンストラクタ\r
+        ******************************************************************************/\r
+       \r
+       public TitleEditorPanel() {\r
+\r
+               super();\r
+               setBorder(new LineBorder(Color.BLACK, 1));\r
+\r
+               addComponents();\r
+       }\r
+       \r
+       private void addComponents() {\r
+               \r
+               setLayout(new SpringLayout());\r
+               \r
+               int y = SEP_HEIGHT_NALLOW;\r
+               int x = SEP_WIDTH_NARROW;\r
+               \r
+               CommonSwingUtils.putComponentOn(this, getJLabel_title("予約名"), 40, PARTS_HEIGHT, x, y);\r
+               CommonSwingUtils.putComponentOn(this, getJComboBox_title(), TITLE_WIDTH, PARTS_HEIGHT, x+SEP_WIDTH_NARROW, y+PARTS_HEIGHT);\r
+               \r
+               CommonSwingUtils.putComponentOn(this, getJButton_getEventId(ITEM_EVIDNEEDED),   100, PARTS_HEIGHT, x+50, y);\r
+               CommonSwingUtils.putComponentOn(this, getJLabel_eventId(""),                                    75,  PARTS_HEIGHT-2, x+50+100+SEP_WIDTH_NARROW, y+1);\r
+               CommonSwingUtils.putComponentOn(this, getJButton_addDate("日付追加"),                       100, PARTS_HEIGHT, x+SEP_WIDTH_NARROW+TITLE_WIDTH-100-SEP_HEIGHT_NALLOW, y);\r
+               \r
+               CommonSwingUtils.putComponentOn(this, getJLabel_ch("CH"), LABEL_WIDTH, PARTS_HEIGHT, x+TITLE_WIDTH+SEP_WIDTH, y);\r
+               CommonSwingUtils.putComponentOn(this, getJComboBox_ch(), CHNAME_WIDTH, PARTS_HEIGHT, x+TITLE_WIDTH+SEP_WIDTH+SEP_WIDTH_NARROW, y+PARTS_HEIGHT);\r
+\r
+               y += PARTS_HEIGHT*2+SEP_HEIGHT_NALLOW;\r
+               \r
+               {\r
+                       int hmx = x;\r
+                       CommonSwingUtils.putComponentOn(this, getJLabel_date("録画日付"),   LABEL_WIDTH,    PARTS_HEIGHT,   hmx,y);\r
+                       CommonSwingUtils.putComponentOn(this, getJComboBox_date(),              DATE_WIDTH,             PARTS_HEIGHT,   hmx+=SEP_WIDTH_NARROW, y+PARTS_HEIGHT);\r
+                       \r
+                       hmx += DATE_WIDTH+SEP_WIDTH;\r
+                       CommonSwingUtils.putComponentOn(this, getJLabel_aTime("開始時刻"),  75,     PARTS_HEIGHT,   hmx, y);\r
+                       CommonSwingUtils.putComponentOn(this, getJTextField_ahh(),              HOUR_WIDTH,     PARTS_HEIGHT,   hmx+=SEP_WIDTH_NARROW, y+PARTS_HEIGHT);\r
+                       CommonSwingUtils.putComponentOn(this, getJLabel_asep(":"),              10,                     PARTS_HEIGHT,   hmx+=HOUR_WIDTH, y+PARTS_HEIGHT);\r
+                       CommonSwingUtils.putComponentOn(this, getJTextField_amm(),              HOUR_WIDTH,     PARTS_HEIGHT,   hmx+=10, y+PARTS_HEIGHT);\r
+                       CommonSwingUtils.putComponentOn(this, getJButton_amm_up(),              20,                     12,                             hmx+=HOUR_WIDTH+2, y+PARTS_HEIGHT);\r
+                       CommonSwingUtils.putComponentOn(this, getJButton_amm_down(),    20,                     12,                             hmx, y+PARTS_HEIGHT+13);\r
+                       \r
+                       hmx += 20+SEP_WIDTH_NARROW;\r
+                       \r
+                       CommonSwingUtils.putComponentOn(this, getJLabel_zTime("終了時刻"),  75,     PARTS_HEIGHT,   hmx, y);\r
+                       {\r
+                               CommonSwingUtils.putComponentOn(this, new JLabel("録画時間"),       75,     PARTS_HEIGHT,   hmx, y+PARTS_HEIGHT*2+2);\r
+                       }\r
+                       CommonSwingUtils.putComponentOn(this, getJTextField_zhh(),              HOUR_WIDTH,     PARTS_HEIGHT,   hmx+=SEP_WIDTH_NARROW, y+PARTS_HEIGHT);\r
+                       CommonSwingUtils.putComponentOn(this, getJLabel_zsep(":"),              10,                     PARTS_HEIGHT,   hmx+=HOUR_WIDTH, y+PARTS_HEIGHT);\r
+                       CommonSwingUtils.putComponentOn(this, getJTextField_zmm(),              HOUR_WIDTH,     PARTS_HEIGHT,   hmx+=10, y+PARTS_HEIGHT);\r
+                       {               \r
+                               CommonSwingUtils.putComponentOn(this, getJLabel_recmin(""),                                     HOUR_WIDTH+10,  PARTS_HEIGHT-2, hmx-10,                 y+PARTS_HEIGHT*2+2+1);\r
+                       }\r
+                       CommonSwingUtils.putComponentOn(this, getJButton_zmm_up(),              20,                     12,                             hmx+=HOUR_WIDTH+2, y+PARTS_HEIGHT);\r
+                       CommonSwingUtils.putComponentOn(this, getJButton_zmm_down(),    20,                     12,                             hmx, y+PARTS_HEIGHT+13);\r
+               \r
+                       hmx += 20+SEP_WIDTH;\r
+                       \r
+                       CommonSwingUtils.putComponentOn(this, jCheckBox_Autocomplete = new JCheckBoxPanel("タイトル自動補完(RDのみ)",LABEL_WIDTH,true),       200, PARTS_HEIGHT, hmx, y);\r
+                       CommonSwingUtils.putComponentOn(this, getJCheckBox_spoex_extend("延長警告での終了時刻延長",LABEL_WIDTH,true),                       200, PARTS_HEIGHT, hmx, y+PARTS_HEIGHT);\r
+                       CommonSwingUtils.putComponentOn(this, getJCheckBox_OverlapDown2("終了時刻1分短縮",LABEL_WIDTH,true),                                   200, PARTS_HEIGHT, hmx, y+PARTS_HEIGHT*2);\r
+               }\r
+               \r
+               y += PARTS_HEIGHT*2+SEP_WIDTH_NARROW;\r
+\r
+               CommonSwingUtils.putComponentOn(this, getJLabel_detail("番組詳細"), 100, PARTS_HEIGHT, x, y);\r
+               CommonSwingUtils.putComponentOn(this, getJScrollPane_detail(), DETAIL_WIDTH, DETAIL_HEIGHT, x+SEP_WIDTH_NARROW, y+PARTS_HEIGHT);\r
+               \r
+               y += PARTS_HEIGHT;\r
+               \r
+               \r
+               \r
+               y += DETAIL_HEIGHT+SEP_HEIGHT_NALLOW;\r
+               \r
+               // 特殊配置\r
+               {\r
+                       int spy = SEP_HEIGHT_NALLOW+PARTS_HEIGHT;\r
+                       x = SEP_WIDTH_NARROW+DETAIL_WIDTH+SEP_WIDTH*2;\r
+                       \r
+                       CommonSwingUtils.putComponentOn(this, new JLabel("予約"),                             BUTTON_WIDTH, PARTS_HEIGHT, x, spy);\r
+                       CommonSwingUtils.putComponentOn(this, getJButton_record("新規"),              BUTTON_WIDTH, PARTS_HEIGHT, x+SEP_WIDTH_NARROW, spy+=PARTS_HEIGHT);\r
+                       CommonSwingUtils.putComponentOn(this, getJButton_update("更新"),              BUTTON_WIDTH, PARTS_HEIGHT, x+SEP_WIDTH_NARROW, spy+=PARTS_HEIGHT);\r
+                       CommonSwingUtils.putComponentOn(this, getJButton_cancel("キャンセル"),     BUTTON_WIDTH, PARTS_HEIGHT, x+SEP_WIDTH_NARROW, spy+=PARTS_HEIGHT);\r
+               }\r
+               \r
+               x+=BUTTON_WIDTH+SEP_WIDTH_NARROW*2;\r
+               \r
+               Dimension d = new Dimension(x,y);\r
+               setPreferredSize(d);\r
+       }\r
+\r
+       public void setRecordExecuter(RecordExecutable o) {\r
+               recexec = o;\r
+       }\r
+       \r
+       /*******************************************************************************\r
+        * アイテムの設定\r
+        ******************************************************************************/\r
+\r
+       /***************************************\r
+        * 番組IDの設定\r
+        **************************************/\r
+\r
+       /**\r
+        * @param enabled 番組IDの取得ができないシチュエーション(予約一覧から開くとか)では取得ボタンをfalseに。\r
+        */\r
+       public boolean setContentIdValue(String content_id, boolean enabled) {\r
+               \r
+               Integer evid = null;\r
+               if ( content_id != null ) {\r
+                       if ( ContentIdEDCB.decodeContentId(content_id) ) {\r
+                               evid = ContentIdEDCB.getEvId();\r
+                       }\r
+                       else if ( ContentIdREGZA.decodeContentId(content_id) && ContentIdREGZA.getEvId() != 0x0000 && ContentIdREGZA.getEvId() != 0xFFFF ) {\r
+                               evid = ContentIdREGZA.getEvId();\r
+                       }\r
+                       else if ( ContentIdDIMORA.decodeContentId(content_id) && ContentIdDIMORA.getEvId() != 0x0000 && ContentIdDIMORA.getEvId() != 0xFFFF ) {\r
+                               evid = ContentIdDIMORA.getEvId();\r
+                       }\r
+               }\r
+\r
+               // みつからにゃい\r
+               if ( evid == null ) {\r
+                       jLabel_eventId.setValue(null);\r
+                       jLabel_eventId.setText(null);\r
+                       jButton_getEventId.setForeground(enabled ? Color.BLUE : Color.GRAY);\r
+                       jButton_getEventId.setEnabled(enabled);\r
+                       \r
+                       return false;\r
+               }\r
+               \r
+               // みつかったじぇい\r
+               jLabel_eventId.setValue(content_id);\r
+               jLabel_eventId.setText(String.format("%04X",evid));\r
+               jButton_getEventId.setForeground(Color.GRAY);\r
+               jButton_getEventId.setEnabled(false);\r
+               \r
+               return true;\r
+       }\r
+       \r
+       /***************************************\r
+        * まとめて設定\r
+        **************************************/\r
+       \r
+       /**\r
+        * まとめて設定:番組情報編\r
+        */\r
+       public void setSelectedValues(ProgDetailList tvd) {\r
+               // 番組ID\r
+               setContentIdValue(tvd.progid,true);\r
+               \r
+               // タイトル\r
+               {\r
+                       int index = jComboBox_title.indexOf(tvd.title);\r
+                       if ( index != -1 ) {\r
+                               jComboBox_title.setSelectedIndex(index);\r
+                       }\r
+               }\r
+               \r
+               // 日付・時刻はここじゃないお\r
+               \r
+               // チャンネル\r
+               {\r
+                       int index = jComboBox_ch.indexOf(tvd.center);\r
+                       if ( index != -1 ) {\r
+                               jComboBox_ch.setSelectedIndex(index);\r
+                       }\r
+               }\r
+               \r
+               // 番組詳細\r
+               {\r
+                       jTextArea_detail.setText(tvd.detail+"\n"+tvd.getAddedDetail());\r
+                       jTextArea_detail.setCaretPosition(0);\r
+               }\r
+       }\r
+       \r
+       /**\r
+        * まとめて設定:類似予約編\r
+        */\r
+       public void setSelectedValues(ReserveList r) {\r
+               // 番組ID\r
+               setContentIdValue(r.getContentId(),true);\r
+               \r
+               // タイトル\r
+               {\r
+                       int index = jComboBox_title.indexOf(r.getTitle());\r
+                       if ( index != -1 ) {\r
+                               jComboBox_title.setSelectedIndex(index);\r
+                       }\r
+               }\r
+               \r
+               // 日付\r
+               {\r
+                       int index = 0;\r
+                       if ( r.getRec_pattern_id() == HDDRecorder.RPTPTN_ID_BYDATE ) {\r
+                               index = 0;\r
+                       }\r
+                       else if ( r.getRec_pattern_id() == HDDRecorder.RPTPTN_ID_MON2THU ) {\r
+                               index = 2;\r
+                       }\r
+                       else if ( r.getRec_pattern_id() == HDDRecorder.RPTPTN_ID_MON2FRI ) {\r
+                               index = 3;\r
+                       }\r
+                       else if ( r.getRec_pattern_id() == HDDRecorder.RPTPTN_ID_MON2SAT ) {\r
+                               index = 4;\r
+                       }\r
+                       else {\r
+                               index = 1;\r
+                       }\r
+                       jComboBox_date.setSelectedIndex(index);\r
+               }\r
+               \r
+               // チャンネル\r
+               {\r
+                       int index = jComboBox_ch.indexOf(r.getCh_name());\r
+                       if ( index != -1 ) {\r
+                               jComboBox_ch.setSelectedIndex(index);\r
+                       }\r
+               }\r
+               \r
+               // 番組詳細\r
+               {\r
+                       jTextArea_detail.setText(r.getDetail());\r
+                       jTextArea_detail.setCaretPosition(0);\r
+               }\r
+       }\r
+       \r
+       \r
+       /***************************************\r
+        * タイトルの設定\r
+        **************************************/\r
+       \r
+       public void setTitleItems(ProgDetailList tvd, LikeReserveList lrl, boolean autocomp ) {\r
+               \r
+               jComboBox_title.removeAllItems();\r
+               \r
+               // 番組表のタイトルを追加\r
+               jComboBox_title.addItem(tvd.title);\r
+               \r
+               // 類似予約のタイトルも追加\r
+               for ( LikeReserveItem ll : lrl ) {\r
+                       String l = ll.getRsv().getTitle();\r
+                       int index = jComboBox_title.indexOf(l);\r
+                       if ( index == -1 ) {\r
+                               // ダブりがなければ追加\r
+                               jComboBox_title.addItem(l);\r
+                       }\r
+               }\r
+\r
+               // タイトル自動設定(RDのみ)\r
+               jCheckBox_Autocomplete.setSelected(autocomp);\r
+               \r
+               // 番組詳細\r
+               jTextArea_detail.setText(tvd.detail+"\n"+tvd.getAddedDetail());\r
+               jTextArea_detail.setCaretPosition(0);\r
+       }\r
+       \r
+       /***************************************\r
+        * 放送局名の設定\r
+        **************************************/\r
+       \r
+       public void setChItem(HDDRecorder myrec, ProgDetailList tvd) {\r
+               \r
+               jComboBox_ch.removeAllItems();\r
+               \r
+               jComboBox_ch.addItem(tvd.center);\r
+               for ( TextValueSet t : myrec.getChValue() ) {\r
+                       if ( t.getText().startsWith("外部") ) {\r
+                               jComboBox_ch.addItem(t.getText());\r
+                       }\r
+               }\r
+               \r
+               jComboBox_ch.setEnabled( jComboBox_ch.getItemCount() > 1 );\r
+       }\r
+       \r
+       /***************************************\r
+        * 時刻と長さの設定\r
+        **************************************/\r
+       \r
+       public void setTimeValue(TimeVal tValues) {\r
+               \r
+               tVal = tValues;\r
+               \r
+               jComboBox_ahh.setSelectedIndex(tVal.ahh);\r
+               jComboBox_amm.setSelectedIndex(tVal.amm);\r
+               jComboBox_zhh.setSelectedIndex(tVal.zhh);\r
+               jComboBox_zmm.setSelectedIndex(tVal.zmm);\r
+               \r
+               if ( tVal.spoex != null && tVal.spoex ) {\r
+                       jCheckBox_spoex_extend.setEnabled(true);\r
+                       jCheckBox_spoex_extend.setForeground(Color.RED);\r
+                       jCheckBox_spoex_extend.setSelected(true);\r
+               }\r
+               else {\r
+                       jCheckBox_spoex_extend.setEnabled(false);\r
+                       jCheckBox_spoex_extend.setForeground(Color.BLACK);\r
+                       jCheckBox_spoex_extend.setSelected(false);\r
+               }\r
+                       \r
+               if ( tVal.clipped != null ) {\r
+                       jCheckBox_OverlapDown2.setEnabled(true);\r
+                       jCheckBox_OverlapDown2.setForeground(tVal.clipped ? Color.RED : Color.BLACK);\r
+                       jCheckBox_OverlapDown2.setSelected(tVal.clipped);\r
+               }\r
+               else {\r
+                       jCheckBox_OverlapDown2.setEnabled(false);\r
+                       jCheckBox_OverlapDown2.setForeground(Color.BLACK);\r
+                       jCheckBox_OverlapDown2.setSelected(false);\r
+               }\r
+       }\r
+       \r
+       private void setRecMinItem() {\r
+               int recmin = CommonUtils.getRecMinVal(\r
+                               jComboBox_ahh.getSelectedIndex(),\r
+                               jComboBox_amm.getSelectedIndex(),\r
+                               jComboBox_zhh.getSelectedIndex(),\r
+                               jComboBox_zmm.getSelectedIndex());\r
+               \r
+               jLabel_recmin.setText(String.valueOf(recmin)+" 分 ");\r
+       }\r
+       \r
+       /***************************************\r
+        * 日付の設定\r
+        **************************************/\r
+       \r
+       public void setDateItems(ProgDetailList tvd, TimeVal tValues) {\r
+               \r
+               jComboBox_date.removeAllItems();\r
+               \r
+               // リスト/新聞形式からの呼び出しなら番組情報をもとに\r
+               GregorianCalendar c = CommonUtils.getCalendar(tValues.date);\r
+               if ( c != null ) {\r
+                       jComboBox_date.addItem(CommonUtils.getDate(c));\r
+                       jComboBox_date.addItem(HDDRecorder.RPTPTN[c.get(Calendar.DAY_OF_WEEK)-Calendar.SUNDAY]);\r
+               }\r
+               \r
+               setDateRepeatItems();\r
+       }\r
+       \r
+       public void setDateItems(ReserveList myrsv, TimeVal tValues) {\r
+               \r
+               jComboBox_date.removeAllItems();\r
+               \r
+               // 本体予約一覧からの呼び出しなら既存の予約情報からの引継ぎ\r
+               GregorianCalendar c = CommonUtils.getCalendar(myrsv.getRec_pattern());\r
+               if ( c != null ) {\r
+                       // 単日予約の場合\r
+                       jComboBox_date.addItem(myrsv.getRec_pattern());\r
+                       jComboBox_date.addItem(HDDRecorder.RPTPTN[c.get(Calendar.DAY_OF_WEEK)-Calendar.SUNDAY]);\r
+               }\r
+               else {\r
+                       // 繰り返し予約の場合\r
+                       jComboBox_date.addItem(myrsv.getRec_nextdate());\r
+                       jComboBox_date.addItem(myrsv.getRec_pattern());\r
+               }\r
+               \r
+               setDateRepeatItems();\r
+       }\r
+       \r
+       private void setDateRepeatItems() {\r
+               jComboBox_date.addItem(HDDRecorder.RPTPTN[7]);\r
+               jComboBox_date.addItem(HDDRecorder.RPTPTN[8]);\r
+               jComboBox_date.addItem(HDDRecorder.RPTPTN[9]);\r
+               jComboBox_date.addItem(HDDRecorder.RPTPTN[10]);\r
+       }\r
+\r
+       /**\r
+        * 登録ボタンの有効・無効\r
+        */\r
+       public void setEnabledRecordButton(boolean enabled) {\r
+               jButton_record.setForeground(enabled ? Color.RED : Color.GRAY);\r
+               jButton_record.setEnabled(enabled);\r
+       }\r
+       \r
+       /**\r
+        * 更新ボタンの有効・無効\r
+        */\r
+       public void setEnabledUpdateButton(boolean enabled) {\r
+               jButton_update.setForeground(enabled ? Color.RED : Color.GRAY);\r
+               jButton_update.setEnabled(enabled);\r
+       }\r
+       \r
+       /*******************************************************************************\r
+        * リスナー\r
+        ******************************************************************************/\r
+       \r
+       /***************************************\r
+        * タイトル関連のリスナー\r
+        **************************************/\r
+\r
+       /**\r
+        * タイトルが設定(!入力)されたらキャレットを先頭に戻す\r
+        */\r
+       private final ItemListener il_titleEntered = new ItemListener() {\r
+               @Override\r
+               public void itemStateChanged(ItemEvent e) {\r
+                       if (e.getStateChange() == ItemEvent.SELECTED) {\r
+                               // キャレットを先頭へ\r
+                               ((JTextField)jComboBox_title.getEditor().getEditorComponent()).setCaretPosition(0);\r
+                       }\r
+               }\r
+       };\r
+       \r
+       \r
+       /**\r
+        * 日付ボタンでタイトルの末尾に日付を追加する\r
+        */\r
+       private ActionListener al_addDate = new ActionListener() {\r
+               @Override\r
+               public void actionPerformed(ActionEvent e) {\r
+                       \r
+                       GregorianCalendar ca = CommonUtils.getCalendar((String) jComboBox_date.getSelectedItem());\r
+                       if ( ca == null ) {\r
+                               // 日付指定でなければ\r
+                               return;\r
+                       }\r
+                       \r
+                       String date = String.format(" %02d_%02d", ca.get(Calendar.MONTH), ca.get(Calendar.DAY_OF_MONTH));\r
+                       String title = (String) jComboBox_title.getSelectedItem();\r
+                       if ( title.endsWith(date) ) {\r
+                               // 同じ日付が追加済みなら\r
+                               return;\r
+                       }\r
+                       \r
+                       String newTitle = title.replaceFirst(" \\d\\d_\\d\\d$", date);\r
+                       if ( title.equals(newTitle) ) {\r
+                               // 日付がついてなかった場合は\r
+                               newTitle = title+date;\r
+                       }\r
+                       \r
+                       // なければ追加して選択、あれば選択のみ\r
+                       int index = -1;\r
+                       for ( int i=0; i<jComboBox_title.getItemCount(); i++ ) {\r
+                               if ( newTitle.equals((String) jComboBox_title.getItemAt(i)) ) {\r
+                                       index = i;\r
+                                       break;\r
+                               }\r
+                       }\r
+                       if ( index == -1 ) {\r
+                               jComboBox_title.addItem(newTitle);\r
+                               index = jComboBox_title.getItemCount()-1;\r
+                       }\r
+                       jComboBox_title.setSelectedIndex(index);\r
+                       \r
+                       // キャレットを末尾へ\r
+                       ((JTextField)jComboBox_title.getEditor().getEditorComponent()).setCaretPosition(newTitle.length());\r
+               }\r
+       };\r
+       \r
+       \r
+       /***************************************\r
+        * 時刻を上下するリスナー\r
+        **************************************/\r
+\r
+       /**\r
+        * 開始時刻を1分進める\r
+        */\r
+       private final ActionListener al_upAmm = new ActionListener() {\r
+               @Override\r
+               public void actionPerformed(ActionEvent e) {\r
+                       _updownMm(jComboBox_date,jComboBox_ahh,jComboBox_amm,-1);\r
+               }\r
+       };\r
+       \r
+       /**\r
+        * 開始時刻を1分戻す\r
+        */\r
+       private final ActionListener al_downAmm = new ActionListener() {\r
+               @Override\r
+               public void actionPerformed(ActionEvent e) {\r
+                       _updownMm(jComboBox_date,jComboBox_ahh,jComboBox_amm,+1);\r
+               }\r
+       };\r
+       \r
+       /**\r
+        * 終了時刻を1分進める\r
+        */\r
+       private final ActionListener al_upZmm = new ActionListener() {\r
+               @Override\r
+               public void actionPerformed(ActionEvent e) {\r
+                       _updownMm(null,jComboBox_zhh,jComboBox_zmm,-1);\r
+               }\r
+       };\r
+       \r
+       /**\r
+        * 終了時刻を1分戻す\r
+        */\r
+       private final ActionListener al_downZmm = new ActionListener() {\r
+               @Override\r
+               public void actionPerformed(ActionEvent e) {\r
+                       _updownMm(null,jComboBox_zhh,jComboBox_zmm,+1);\r
+               }\r
+       };\r
+       \r
+       /**\r
+        * updown共通部品\r
+        */\r
+       private void _updownMm(JComboBox dt, JComboBox hh, JComboBox mm, int n) {\r
+               \r
+               String olddate;\r
+               if ( dt != null ) {\r
+                       olddate = (String) jComboBox_date.getItemAt(0);\r
+               }\r
+               else {\r
+                       olddate = CommonUtils.getDate();\r
+               }\r
+               GregorianCalendar cal = CommonUtils.getCalendar(olddate+" "+hh.getSelectedItem()+":"+mm.getSelectedItem());\r
+               cal.add(Calendar.MINUTE, n);\r
+               hh.setSelectedIndex(cal.get(Calendar.HOUR_OF_DAY));\r
+               mm.setSelectedIndex(cal.get(Calendar.MINUTE));\r
+\r
+               if ( dt == null ) {\r
+                       return;\r
+               }\r
+\r
+               // 開始時刻の場合は日付変更線をまたぐかも\r
+               \r
+               String newdate = CommonUtils.getDate(cal);\r
+               String ptrn = HDDRecorder.RPTPTN[cal.get(Calendar.DAY_OF_WEEK)-1];\r
+               \r
+               int idx = dt.getSelectedIndex();\r
+               \r
+               dt.removeItemAt(0);\r
+               dt.insertItemAt(newdate, 0);\r
+               dt.removeItemAt(1);\r
+               dt.insertItemAt(ptrn, 1);\r
+               \r
+               dt.setSelectedIndex(idx);\r
+       }\r
+       \r
+       /**\r
+        * 時刻アイテムが変更された\r
+        */\r
+       private final ItemListener il_timemod = new ItemListener() {\r
+               @Override\r
+               public void itemStateChanged(ItemEvent e) {\r
+                       if ( e.getStateChange() == ItemEvent.SELECTED ) {\r
+                               setRecMinItem();\r
+                       }                       \r
+               }\r
+       };\r
+\r
+       \r
+       /***************************************\r
+        * 延長警告のリスナー\r
+        **************************************/\r
+       \r
+       /**\r
+        * 延長警告のON/OFF\r
+        */\r
+       private final ActionListener al_spoexClicked = new ActionListener() {\r
+               @Override\r
+               public void actionPerformed(ActionEvent e) {\r
+                       \r
+                       GregorianCalendar cz = CommonUtils.getCalendar((String) jComboBox_date.getItemAt(0));\r
+                       cz.add(Calendar.HOUR_OF_DAY, jComboBox_zhh.getSelectedIndex()-cz.get(Calendar.HOUR_OF_DAY));\r
+                       cz.add(Calendar.MINUTE, jComboBox_zmm.getSelectedIndex()-cz.get(Calendar.MINUTE));\r
+                       \r
+                       if ( tVal.spoexlen > 0 ) {\r
+                               cz.add(Calendar.MINUTE, (jCheckBox_spoex_extend.isSelected() ? +tVal.spoexlen : -tVal.spoexlen));\r
+                               \r
+                               jComboBox_zhh.setSelectedIndex(cz.get(Calendar.HOUR_OF_DAY));\r
+                               jComboBox_zmm.setSelectedIndex(cz.get(Calendar.MINUTE));\r
+                       }\r
+               }\r
+       };\r
+       \r
+       \r
+       /***************************************\r
+        * 1分短縮のリスナー\r
+        **************************************/\r
+\r
+       /**\r
+        * 1分短縮のON/OFF\r
+        */\r
+       private final ActionListener al_overlapClipClicked = new ActionListener() {\r
+               @Override\r
+               public void actionPerformed(ActionEvent e) {\r
+                       \r
+                       GregorianCalendar cz = CommonUtils.getCalendar((String) jComboBox_date.getItemAt(0));\r
+                       cz.add(Calendar.HOUR_OF_DAY, jComboBox_zhh.getSelectedIndex()-cz.get(Calendar.HOUR_OF_DAY));\r
+                       cz.add(Calendar.MINUTE, jComboBox_zmm.getSelectedIndex()-cz.get(Calendar.MINUTE));\r
+                       \r
+                       if (jCheckBox_OverlapDown2.isSelected() == true) {\r
+                               cz.add(Calendar.MINUTE,-1);\r
+                       }\r
+                       else {\r
+                               cz.add(Calendar.MINUTE,+1);\r
+                       }\r
+                       \r
+                       jComboBox_zhh.setSelectedIndex(cz.get(Calendar.HOUR_OF_DAY));\r
+                       jComboBox_zmm.setSelectedIndex(cz.get(Calendar.MINUTE));\r
+               }\r
+       };\r
+\r
+\r
+       /***************************************\r
+        * 予約ボタン3種\r
+        **************************************/\r
+\r
+       /**\r
+        * 登録実行\r
+        */\r
+       private final ActionListener al_doRecord = new ActionListener() {\r
+               @Override\r
+               public void actionPerformed(ActionEvent e) {\r
+                       if (recexec!=null) recexec.doRecord();\r
+               }\r
+       };\r
+\r
+       /**\r
+        * 更新実行\r
+        */\r
+       private final ActionListener al_doUpdate = new ActionListener() {\r
+               public void actionPerformed(ActionEvent e) {\r
+                       if (recexec!=null) recexec.doUpdate();\r
+               }\r
+       };\r
+       \r
+       /**\r
+        * キャンセル\r
+        */\r
+       private final ActionListener al_doCancel = new ActionListener() {\r
+               @Override\r
+               public void actionPerformed(ActionEvent e) {\r
+                       if (recexec!=null) recexec.doCancel();\r
+               }\r
+       };\r
+       \r
+       /***************************************\r
+        * 番組ID取得\r
+        **************************************/\r
+       \r
+       /**\r
+        * 番組IDを取得する\r
+        */\r
+       private final ActionListener al_getEventId = new ActionListener() {\r
+               @Override\r
+               public void actionPerformed(ActionEvent e) {\r
+                       \r
+                       if ( recexec != null ) {\r
+                               \r
+                               String content_id = recexec.doGetEventId();\r
+                               \r
+                               if ( content_id != null ) {\r
+                                       setContentIdValue(content_id, false);\r
+                               }\r
+                       }\r
+               }\r
+       };\r
+       \r
+       \r
+       /*******************************************************************************\r
+        * 選択された値を呼び出し元に戻す\r
+        ******************************************************************************/\r
+       \r
+       public ReserveList getSelectedValues(ReserveList r) {\r
+               \r
+               r.setTitle((String)jComboBox_title.getSelectedItem());\r
+               r.setTitlePop(TraceProgram.replacePop(r.getTitle()));\r
+               r.setDetail(jTextArea_detail.getText());\r
+               \r
+               r.setCh_name((String)jComboBox_ch.getSelectedItem());\r
+               r.setChannel("");                       // PostRdEntry()中で取得するのでここはダミー\r
+               \r
+               r.setRec_pattern((String)jComboBox_date.getSelectedItem());\r
+               r.setRec_pattern_id(-1);        // PostRdEntry()中で取得するのでここはダミー\r
+               \r
+               r.setRec_nextdate((String)jComboBox_date.getItemAt(0)); // PostRdEntry()中で取得するのでここはダミー(日付を入れるのはDIGA用)\r
+               \r
+               r.setAhh((String) jComboBox_ahh.getSelectedItem());\r
+               r.setAmm((String) jComboBox_amm.getSelectedItem());\r
+               r.setZhh((String) jComboBox_zhh.getSelectedItem());\r
+               r.setZmm((String) jComboBox_zmm.getSelectedItem());\r
+               \r
+               r.setRec_min("");                       // PostRdEntry()中で取得するのでここはダミー\r
+               \r
+               r.setStartDateTime("");         // PostRdEntry()中で取得するのでここはダミー\r
+               r.setEndDateTime("");           // PostRdEntry()中で取得するのでここはダミー\r
+\r
+               if ( jLabel_eventId.getText() != null && ! (jLabel_eventId.getText().endsWith("0000") ||jLabel_eventId.getText().endsWith("FFFF")) ) {\r
+                       r.setContentId(jLabel_eventId.getValue());\r
+               }\r
+               else {\r
+                       r.setContentId("");\r
+               }\r
+               \r
+               r.setAutocomplete(jCheckBox_Autocomplete.isSelected());\r
+               \r
+               return r;\r
+       }\r
+       \r
+       \r
+       /*******************************************************************************\r
+        * コンポーネント\r
+        ******************************************************************************/\r
+       \r
+       private JLabel getJLabel_date(String s) {\r
+               if (jLabel_date == null) {\r
+                       jLabel_date = new JLabel();\r
+                       jLabel_date.setText(s);\r
+               }\r
+               return(jLabel_date);\r
+       }\r
+       \r
+       private JComboBox getJComboBox_date() {\r
+               if (jComboBox_date == null) {\r
+                       jComboBox_date = new JComboBox();\r
+               }\r
+               return jComboBox_date;\r
+       }\r
+       \r
+       private JLabel getJLabel_detail(String s) {\r
+               if (jLabel_detail == null) {\r
+                       jLabel_detail = new JLabel();\r
+                       jLabel_detail.setText(s);\r
+               }\r
+               return(jLabel_detail);\r
+       }\r
+\r
+       private JCheckBoxPanel getJCheckBox_OverlapDown2(String s, int labelWidth, boolean rev) {\r
+               if (jCheckBox_OverlapDown2 == null) {\r
+                       jCheckBox_OverlapDown2 = new JCheckBoxPanel(s,labelWidth,rev);\r
+\r
+                       jCheckBox_OverlapDown2.addActionListener(al_overlapClipClicked);\r
+               }\r
+               return(jCheckBox_OverlapDown2);\r
+       }\r
+       \r
+       private JCheckBoxPanel getJCheckBox_spoex_extend(String s, int labelWidth, boolean rev) {\r
+               \r
+               if (jCheckBox_spoex_extend == null) {\r
+                       jCheckBox_spoex_extend = new JCheckBoxPanel(s,labelWidth,rev);\r
+\r
+                       jCheckBox_spoex_extend.addActionListener(al_spoexClicked);\r
+               }\r
+               return(jCheckBox_spoex_extend);\r
+       }\r
+       \r
+       private JScrollPane getJScrollPane_detail()     {\r
+               if (jScrollPane_detail == null) {\r
+                       jScrollPane_detail = new JScrollPane(getJTextArea_detail(),JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);\r
+                       \r
+                       jScrollPane_detail.setBorder(new LineBorder(Color.BLACK));\r
+               }\r
+               return(jScrollPane_detail);\r
+       }\r
+       \r
+       private JTextArea getJTextArea_detail() {\r
+               if (jTextArea_detail == null) {\r
+                       jTextArea_detail = new JTextAreaWithPopup();\r
+                       jTextArea_detail.setLineWrap(true);\r
+               }\r
+               return(jTextArea_detail);\r
+       }\r
+\r
+       private JLabel getJLabel_title(String s) {\r
+               if (jLabel_title == null) {\r
+                       jLabel_title = new JLabel();\r
+                       jLabel_title.setText(s);\r
+               }\r
+               return(jLabel_title);\r
+       }\r
+       \r
+       private JLabel getJLabel_ch(String s) {\r
+               if (jLabel_ch == null) {\r
+                       jLabel_ch = new JLabel();\r
+                       jLabel_ch.setText(s);\r
+               }\r
+               return(jLabel_ch);\r
+       }\r
+       \r
+       private JLabel getJLabel_aTime(String s) {\r
+               if (jLabel_aTime == null) {\r
+                       jLabel_aTime = new JLabel();\r
+                       jLabel_aTime.setText(s);\r
+               }\r
+               return(jLabel_aTime);\r
+       }\r
+       \r
+       private JLabel getJLabel_zTime(String s) {\r
+               if (jLabel_zTime == null) {\r
+                       jLabel_zTime = new JLabel();\r
+                       jLabel_zTime.setText(s);\r
+               }\r
+               return(jLabel_zTime);\r
+       }\r
+\r
+       private JLabel getJLabel_recmin(String s) {\r
+               if (jLabel_recmin == null) {\r
+                       jLabel_recmin = new JLabel();\r
+                       jLabel_recmin.setText(s);\r
+                       jLabel_recmin.setHorizontalAlignment(JLabel.RIGHT);\r
+                       jLabel_recmin.setForeground(Color.BLUE);\r
+                       \r
+                       jLabel_recmin.setBorder(new LineBorder(Color.LIGHT_GRAY));\r
+               }\r
+               return(jLabel_recmin);\r
+       }\r
+       \r
+       private JComboBox getJComboBox_title() {\r
+               if (jComboBox_title == null) {\r
+                       jComboBox_title = new JComboBoxWithPopup();\r
+                       jComboBox_title.addPopupWidth(150);\r
+                       jComboBox_title.setEditable(true);\r
+                       \r
+                       jComboBox_title.addItemListener(il_titleEntered);\r
+               }\r
+               return jComboBox_title;\r
+       }\r
+       \r
+       /**\r
+        * EpgDataCap_BonプラグインのCHコードとを利用してテレビ王国から番組IDを取得します\r
+        * @since 3.14.5β\r
+        */\r
+       private JButton getJButton_getEventId(String s) {\r
+               if (jButton_getEventId == null) {\r
+                       jButton_getEventId = new JButton(s);\r
+                       \r
+                       jButton_getEventId.addActionListener(al_getEventId);\r
+               }\r
+               return jButton_getEventId;\r
+       }\r
+       \r
+       private JTXTLabel getJLabel_eventId(String s) {\r
+               if ( jLabel_eventId == null ) {\r
+                       jLabel_eventId = new JTXTLabel();\r
+                       jLabel_eventId.setHorizontalAlignment(JLabel.CENTER);\r
+                       jLabel_eventId.setForeground(Color.BLUE);\r
+                       \r
+                       jLabel_eventId.setBorder(new LineBorder(Color.LIGHT_GRAY));\r
+               }\r
+               return jLabel_eventId;\r
+       }\r
+       \r
+       private JButton getJButton_addDate(String s) {\r
+               if (jButton_addDate == null) {\r
+                       jButton_addDate = new JButton(s);\r
+                       \r
+                       jButton_addDate.addActionListener(al_addDate);\r
+               }\r
+               return jButton_addDate;\r
+       }\r
+\r
+       private JComboBox getJComboBox_ch() {\r
+               if (jComboBox_ch== null) {\r
+                       jComboBox_ch = new JWideComboBox();\r
+                       jComboBox_ch.addPopupWidth(150);\r
+               }\r
+               return jComboBox_ch;\r
+       }\r
+       \r
+       // 開始時刻\r
+       private JComboBox getJTextField_ahh() {\r
+               if (jComboBox_ahh == null) {\r
+                       jComboBox_ahh = new JComboBoxWithPopup();\r
+                       jComboBox_ahh.addPopupWidth(HOUR_WIDTH);\r
+                       for ( int h=0; h<24; h++ ) {\r
+                               jComboBox_ahh.addItem(String.format("%02d", h));\r
+                       }\r
+                       \r
+                       jComboBox_ahh.addItemListener(il_timemod);\r
+               }\r
+               return jComboBox_ahh;\r
+       }\r
+       private JComboBox getJTextField_amm() {\r
+               if (jComboBox_amm == null) {\r
+                       jComboBox_amm = new JComboBoxWithPopup();\r
+                       jComboBox_amm.addPopupWidth(HOUR_WIDTH);\r
+                       for ( int m=0; m<60; m++ ) {\r
+                               jComboBox_amm.addItem(String.format("%02d", m));\r
+                       }\r
+                       \r
+                       jComboBox_amm.addItemListener(il_timemod);\r
+               }\r
+               return jComboBox_amm;\r
+       }\r
+       private JLabel getJLabel_asep(String s)\r
+       {\r
+               if (jLabel_asep == null) {\r
+                       jLabel_asep = new JLabel(s,JLabel.CENTER);\r
+               }\r
+               return(jLabel_asep);\r
+       }\r
+       // 開始時刻上げ下げ\r
+       private JButton getJButton_amm_up() {\r
+               if (jButton_amm_up == null) {\r
+                       jButton_amm_up = new JButton();\r
+                       //\r
+                       jButton_amm_up.addActionListener(al_upAmm);\r
+               }\r
+               return jButton_amm_up;\r
+       }\r
+       private JButton getJButton_amm_down() {\r
+               if (jButton_amm_down == null) {\r
+                       jButton_amm_down = new JButton();\r
+                       //\r
+                       jButton_amm_down.addActionListener(al_downAmm);\r
+               }\r
+               return jButton_amm_down;\r
+       }\r
+       \r
+       //\r
+       private JComboBox getJTextField_zhh() {\r
+               if (jComboBox_zhh == null) {\r
+                       jComboBox_zhh = new JComboBoxWithPopup();\r
+                       jComboBox_zhh.addPopupWidth(HOUR_WIDTH);\r
+                       for ( int h=0; h<24; h++ ) {\r
+                               jComboBox_zhh.addItem(String.format("%02d", h));\r
+                       }\r
+                       \r
+                       jComboBox_zhh.addItemListener(il_timemod);\r
+               }\r
+               return jComboBox_zhh;\r
+       }\r
+       private JComboBox getJTextField_zmm() {\r
+               if (jComboBox_zmm == null) {\r
+                       jComboBox_zmm = new JComboBoxWithPopup();\r
+                       jComboBox_zmm.addPopupWidth(HOUR_WIDTH);\r
+                       for ( int m=0; m<60; m++ ) {\r
+                               jComboBox_zmm.addItem(String.format("%02d", m));\r
+                       }\r
+                       \r
+                       jComboBox_zmm.addItemListener(il_timemod);\r
+               }\r
+               return jComboBox_zmm;\r
+       }\r
+       private JLabel getJLabel_zsep(String s)\r
+       {\r
+               if (jLabel_zsep == null) {\r
+                       jLabel_zsep = new JLabel(s,JLabel.CENTER);\r
+               }\r
+               return(jLabel_zsep);\r
+       }\r
+       // 終了時刻上げ下げ\r
+       private JButton getJButton_zmm_up() {\r
+               if (jButton_zmm_up == null) {\r
+                       jButton_zmm_up = new JButton();\r
+                       //\r
+                       jButton_zmm_up.addActionListener(al_upZmm);\r
+               }\r
+               return jButton_zmm_up;\r
+       }\r
+       private JButton getJButton_zmm_down() {\r
+               if (jButton_zmm_down == null) {\r
+                       jButton_zmm_down = new JButton();\r
+                       //\r
+                       jButton_zmm_down.addActionListener(al_downZmm);\r
+               }\r
+               return jButton_zmm_down;\r
+       }\r
+       \r
+       private JButton getJButton_record(String s) {\r
+               if (jButton_record == null) {\r
+                       jButton_record = new JButton(s);\r
+                       jButton_record.setForeground(Color.RED);\r
+                       jButton_record.addActionListener(al_doRecord);\r
+               }\r
+               return jButton_record;\r
+       }\r
+       \r
+       private JButton getJButton_update(String s) {\r
+               if (jButton_update == null) {\r
+                       jButton_update = new JButton();\r
+                       jButton_update.setText(s);\r
+\r
+                       jButton_update.addActionListener(al_doUpdate);\r
+               }\r
+               \r
+               return jButton_update;\r
+       }\r
+\r
+       private JButton getJButton_cancel(String s) {\r
+               if (jButton_cancel == null) {\r
+                       jButton_cancel = new JButton(s);\r
+                       jButton_cancel.addActionListener(al_doCancel);\r
+               }\r
+               return jButton_cancel;\r
+       }\r
+       \r
+}\r
index a8b7e81..e07ef65 100644 (file)
@@ -160,7 +160,7 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener {
        private static final int OPENING_WIAT = 500;                            // まあ起動時しか使わないんですけども\r
 \r
        private static final String MSGID = "[鯛ナビ] ";\r
-       private static final String ERRID = "[ERROR]"+MSGID;\r
+//     private static final String ERRID = "[ERROR]"+MSGID;\r
        private static final String DBGID = "[DEBUG]"+MSGID;\r
        \r
        /**\r
@@ -433,11 +433,13 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener {
                protected void showPopupForTraceProgram(\r
                                final JComponent comp,\r
                                final ProgDetailList tvd, final String keyword, final int threshold,\r
-                               final int x, final int y, final int h) {\r
+                               final int x, final int y) {\r
                        \r
-                       timer_now.pause();\r
-                       Viewer.this.showPopupForTraceProgram(comp, tvd, keyword, threshold, x, y, h);\r
-                       timer_now.start();\r
+                       timer_now.pause();      // 停止\r
+                       \r
+                       Viewer.this.showPopupForTraceProgram(comp, tvd, keyword, threshold, x, y, null);\r
+                       \r
+                       timer_now.start();      // 再開\r
                }\r
 \r
                @Override\r
@@ -583,11 +585,13 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener {
                protected void showPopupForTraceProgram(\r
                                final JComponent comp,\r
                                final ProgDetailList tvd, final String keyword, final int threshold,\r
-                               final int x, final int y, final int h) {\r
+                               final int x, final int y, final String clickedDateTime) {\r
                        \r
-                       timer_now.pause();\r
-                       Viewer.this.showPopupForTraceProgram(comp, tvd, keyword, threshold, x, y, h);\r
-                       timer_now.start();\r
+                       timer_now.pause();      // 停止\r
+                       \r
+                       Viewer.this.showPopupForTraceProgram(comp, tvd, keyword, threshold, x, y, clickedDateTime);\r
+                       \r
+                       timer_now.start();      // 再開\r
                }\r
 \r
                @Override\r
@@ -693,17 +697,17 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener {
                }\r
                \r
                @Override\r
-               protected JMenuItem getExecOnOffMenuItem(boolean fexec, String title,\r
-                               String chnam, String rsvId, String recId) {\r
+               protected JMenuItem getExecOnOffMenuItem(boolean fexec,\r
+                               String start, String title, String chnam, String rsvId, String recId) {\r
 \r
-                       return Viewer.this.getExecOnOffMenuItem(fexec, title, chnam, rsvId, recId, 0);\r
+                       return Viewer.this.getExecOnOffMenuItem(fexec, start, title, chnam, rsvId, recId, 0);\r
                }\r
 \r
                @Override\r
-               protected JMenuItem getRemoveRsvMenuItem(String title, String chnam,\r
-                               String rsvId, String recId) {\r
+               protected JMenuItem getRemoveRsvMenuItem(\r
+                               String start, String title, String chnam,       String rsvId, String recId) {\r
                        \r
-                       return Viewer.this.getRemoveRsvMenuItem(title, chnam, rsvId, recId, 0);\r
+                       return Viewer.this.getRemoveRsvMenuItem(start, title, chnam, rsvId, recId, 0);\r
                }\r
 \r
                @Override\r
@@ -1575,115 +1579,27 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener {
         */\r
        private LikeReserveList findLikeReserves(ProgDetailList tvd, String keyword, int threshold) {\r
                \r
-               LikeReserveList likeRsvList = new LikeReserveList();\r
-               \r
-               // 曖昧検索のための初期化\r
-               String keywordPop = null;\r
+               String keywordVal = null;\r
                int thresholdVal = 0;\r
-               if (threshold > 0) {\r
-                       // キーワード指定がある場合\r
-                       keywordPop = TraceProgram.replacePop(keyword);\r
-                       thresholdVal = threshold;\r
-               }\r
-               else {\r
-                       // キーワード指定がない場合\r
-                       keywordPop = tvd.titlePop;\r
-                       thresholdVal = env.getDefaultFazzyThreshold();\r
-               }\r
-\r
-               // 検索範囲\r
-               long rangeLikeRsv = env.getRangeLikeRsv()*3600000;\r
-               \r
-               for ( HDDRecorder recorder : recorders ) {\r
-                       \r
-                       // 終了した予約を整理する\r
-                       recorder.refreshReserves();\r
-                       \r
-                       for ( ReserveList r : recorder.getReserves() ) {\r
-                               \r
-                               // タイトルのマッチング\r
-                               if ( ! isLikeTitle(tvd, r, keywordPop, thresholdVal) ) {\r
-                                       continue;\r
-                               }\r
-                               \r
-                               // 放送局のマッチング\r
-                               if ( ! isLikeChannel(tvd, r) ) {\r
-                                       continue;\r
-                               }\r
-                               \r
-                               // 近接時間チェック\r
-                               Long d = getLikeDist(tvd, r, rangeLikeRsv);\r
-                               if ( d == null ) {\r
-                                       continue;\r
-                               }\r
-                               \r
-                               // 類似予約あり\r
-                               likeRsvList.add(new LikeReserveItem(recorder, r, d));\r
-                       }\r
-                       \r
-               }\r
                \r
-               return likeRsvList;\r
-       }\r
-       private boolean isLikeTitle(ProgDetailList tvd, ReserveList r, String keywordPop, int thresholdVal) {\r
-               \r
-               if (env.getDisableFazzySearch() == false) {\r
-                       // 双方向の比較を行う・正引き\r
-                       int fazScore = TraceProgram.sumScore(keywordPop, r.getTitlePop());\r
-                       if ( fazScore >= thresholdVal ) {\r
-                               return true;\r
-                       }\r
-                       else if ( ! env.getDisableFazzySearchReverse() ) {\r
-                               // 逆引き\r
-                               fazScore = TraceProgram.sumScore(r.getTitlePop(), keywordPop);\r
-                               if ( fazScore >= thresholdVal) {\r
-                                       return true;\r
-                               }\r
-                       }\r
-               }\r
-               else {\r
-                       if ( r.getTitlePop().equals(tvd.titlePop )) {\r
-                               return true;\r
-                       }\r
-               }\r
-               \r
-               return false;\r
-       }\r
-       private boolean isLikeChannel(ProgDetailList tvd, ReserveList r) {\r
-               \r
-               if ( r.getCh_name() == null ) {\r
-                       return false;\r
-               }\r
-               if ( ! r.getCh_name().equals(tvd.center) ) {\r
-                       return false;\r
-               }\r
-               \r
-               return true;\r
-       }\r
-       private Long getLikeDist(ProgDetailList tvd, ReserveList r, long rangeLikeRsv) {\r
-               \r
-               Long d = null;\r
-               \r
-               ArrayList<String> starts = new ArrayList<String>();\r
-               ArrayList<String> ends = new ArrayList<String>();\r
-               CommonUtils.getStartEndList(starts, ends, r);\r
-                \r
-               for ( int j=0; j<starts.size(); j++ ) {\r
-                       long dtmp = CommonUtils.getCompareDateTime(starts.get(j),tvd.startDateTime);\r
-                       if ( rangeLikeRsv > 0 && Math.abs(dtmp) >= rangeLikeRsv ) {\r
-                               // 範囲指定があって範囲外ならスキップ\r
-                               continue;\r
+               // 曖昧検索のための初期化\r
+               if ( ! env.getDisableFazzySearch() ) {\r
+                       if ( threshold > 0 ) {\r
+                               // キーワード指定がある場合\r
+                               keywordVal = TraceProgram.replacePop(keyword);\r
+                               thresholdVal = threshold;\r
                        }\r
-                       else if ( d == null || Math.abs(d) > Math.abs(dtmp) ) {\r
-                               // 初値、または一番小さい値を採用\r
-                               d = dtmp;\r
+                       else {\r
+                               // キーワード指定がない場合\r
+                               keywordVal = tvd.titlePop;\r
+                               thresholdVal = env.getDefaultFazzyThreshold();\r
                        }\r
                }\r
-               \r
-               return d;\r
+\r
+               // 検索実行\r
+               return recorders.findLikeReserves(tvd, keywordVal, thresholdVal, env.getRangeLikeRsv(), ! env.getDisableFazzySearchReverse());\r
        }\r
        \r
-       \r
        /***\r
         * \r
         * リスト・新聞形式共通\r
@@ -1696,7 +1612,7 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener {
        public void showPopupForTraceProgram(\r
                        final JComponent comp,\r
                        final ProgDetailList tvd, final String keyword, final int threshold,\r
-                       final int x, final int y, final int h)\r
+                       final int x, final int y, final String clickedDateTime)\r
        {\r
                JPopupMenu pop = new JPopupMenu();\r
        \r
@@ -1707,7 +1623,10 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener {
                        // 過去ログは処理対象外です\r
                }\r
                else {\r
-                       JMenuItem menuItem = new JMenuItem("予約する【"+tvd.title+" ("+tvd.center+")】");\r
+                       JMenuItem menuItem = new JMenuItem(String.format("予約する【%s %s - %s(%s)】",tvd.accurateDate,tvd.start,tvd.title,tvd.center));\r
+                       menuItem.setForeground(new Color(0,127,0));\r
+                       Font f = menuItem.getFont();\r
+                       menuItem.setFont(f.deriveFont(f.getStyle()|Font.BOLD));\r
                        \r
                        menuItem.addActionListener(new ActionListener() {\r
                                public void actionPerformed(ActionEvent e) {\r
@@ -1722,7 +1641,7 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener {
                                        }\r
                                        \r
                                        //\r
-                                       if (rdialog.isReserved()) {\r
+                                       if (rdialog.isSucceededReserve()) {\r
                                                listed.updateReserveMark();\r
                                                paper.updateReserveBorder(tvd.center);\r
                                                reserved.redrawReservedList();\r
@@ -1735,23 +1654,20 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener {
                pop.addSeparator();\r
                \r
                // 類似予約検索\r
-               LikeReserveList likeRsvList = findLikeReserves(tvd, "", 0);\r
+               LikeReserveList likeRsvList;\r
+               if ( env.getDisableFazzySearch() ) {\r
+                       likeRsvList = recorders.findLikeReserves(tvd, null, 0, env.getRangeLikeRsv(), false);\r
+               }\r
+               else {\r
+                       likeRsvList = recorders.findLikeReserves(tvd, tvd.titlePop, env.getDefaultFazzyThreshold(), env.getRangeLikeRsv(), ! env.getDisableFazzySearchReverse());\r
+               }\r
                \r
                // 重複予約検索\r
-               LikeReserveList overlapRsvList = new LikeReserveList();\r
-               searchOverlapRsv(overlapRsvList, tvd, h);\r
-               \r
+               LikeReserveList overlapRsvList = recorders.findOverlapReserves(tvd, clickedDateTime);\r
+\r
                // 類似と重複で被るものを重複から除外\r
-               for ( LikeReserveItem ll : likeRsvList ) {\r
-                       int i=0;\r
-                       for ( ; i<overlapRsvList.size(); i++ ) {\r
-                               if ( ll.getRsv() == overlapRsvList.getRsv(i) ) {\r
-                                       break;\r
-                               }\r
-                       }\r
-                       if ( i < overlapRsvList.size() ) {\r
-                               overlapRsvList.remove(i);\r
-                       }\r
+               for ( LikeReserveItem item : likeRsvList ) {\r
+                       overlapRsvList.removeDup(item);\r
                }\r
                \r
                // 予約実行ON・OFF\r
@@ -1767,15 +1683,16 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener {
                                        rsvList = overlapRsvList;\r
                                }\r
                                \r
-                               for ( int i=0; i<rsvList.size(); i++ ) {\r
+                               for ( LikeReserveItem rsvItem : rsvList ) {\r
                                        \r
-                                       final boolean fexec = rsvList.getRsv(i).getExec();\r
-                                       final String title = rsvList.getRsv(i).getTitle();\r
-                                       final String chnam = rsvList.getRsv(i).getCh_name();\r
-                                       final String rsvId = rsvList.getRsv(i).getId();\r
-                                       final String recId = rsvList.getRec(i).Myself();\r
+                                       final boolean fexec = rsvItem.getRsv().getExec();\r
+                                       final String start = rsvItem.getRsv().getAhh()+":"+rsvItem.getRsv().getAmm();\r
+                                       final String title = rsvItem.getRsv().getTitle();\r
+                                       final String chnam = rsvItem.getRsv().getCh_name();\r
+                                       final String rsvId = rsvItem.getRsv().getId();\r
+                                       final String recId = rsvItem.getRec().Myself();\r
                                        \r
-                                       pop.add(getExecOnOffMenuItem(fexec,title,chnam,rsvId,recId,n));\r
+                                       pop.add(getExecOnOffMenuItem(fexec,start,title,chnam,rsvId,recId,n));\r
                                }\r
                                \r
                                pop.addSeparator();\r
@@ -1797,14 +1714,15 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener {
                                        rsvList = overlapRsvList;\r
                                }\r
                                \r
-                               for (int i=0; i<rsvList.size(); i++) {\r
+                               for ( LikeReserveItem rsvItem : rsvList ) {\r
                                        \r
-                                       final String title = rsvList.getRsv(i).getTitle();\r
-                                       final String chnam = rsvList.getRsv(i).getCh_name();\r
-                                       final String rsvId = rsvList.getRsv(i).getId();\r
-                                       final String recId = rsvList.getRec(i).Myself();\r
+                                       final String start = rsvItem.getRsv().getAhh()+":"+rsvItem.getRsv().getAmm();\r
+                                       final String title = rsvItem.getRsv().getTitle();\r
+                                       final String chnam = rsvItem.getRsv().getCh_name();\r
+                                       final String rsvId = rsvItem.getRsv().getId();\r
+                                       final String recId = rsvItem.getRec().Myself();\r
                                        \r
-                                       pop.add(getRemoveRsvMenuItem(title,chnam,rsvId,recId,n));\r
+                                       pop.add(getRemoveRsvMenuItem(start, title,chnam,rsvId,recId,n));\r
                                }\r
                                \r
                                pop.addSeparator();\r
@@ -1818,7 +1736,7 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener {
                // ジャンプする\r
                {\r
                        if ( mainWindow.isTabSelected(MWinTab.LISTED) ) {\r
-                               pop.add(getJumpMenuItem(tvd.title,tvd.center,tvd.startDateTime));\r
+                               pop.add(getJumpMenuItem(tvd.title,tvd.center,tvd.accurateDate+" "+tvd.start));\r
                        }\r
                        if ( mainWindow.isTabSelected(MWinTab.LISTED) || mainWindow.isTabSelected(MWinTab.PAPER) ) {\r
                                JMenuItem mi = getJumpToLastWeekMenuItem(tvd.title,tvd.center,tvd.startDateTime);\r
@@ -1951,8 +1869,8 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener {
                        \r
                        if ( ! isRemoveItem )   // 過去ログは処理対象外です\r
                        {\r
-                               final String label = tvd.title+" ("+tvd.center+")";\r
-                               JMenuItem menuItem = new JMenuItem("ピックアップへの追加【"+label+"】");\r
+                               final String label = String.format("%s(%s)",tvd.title,tvd.center);\r
+                               JMenuItem menuItem = new JMenuItem(String.format("ピックアップへの追加【%s %s - %s】",tvd.accurateDate,tvd.start,label));\r
                                menuItem.addActionListener(new ActionListener() {\r
                                        public void actionPerformed(ActionEvent e) {\r
                                                //\r
@@ -2368,10 +2286,17 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener {
        /**\r
         *  予約を削除するメニューアイテム\r
         */\r
-       private JMenuItem getRemoveRsvMenuItem(final String title, final String chnam, final String rsvId, final String recId, int n) {\r
+       private JMenuItem getRemoveRsvMenuItem(final String start, final String title, final String chnam, final String rsvId, final String recId, int n) {\r
                //\r
-               JMenuItem menuItem = new JMenuItem(((n==0)?"予約を削除する【":"隣接予約を削除する【")+title+"("+chnam+")/"+recId+"】");\r
+               JMenuItem menuItem = new JMenuItem();\r
+               \r
+               String mode = "削除";\r
                menuItem.setForeground(Color.RED);\r
+               \r
+               String target = ( n==0 ) ? "予約" : "隣接予約";\r
+\r
+               menuItem.setText(String.format("%sを%sにする【%s - %s(%s)/%s】",target,mode,start,title,chnam,recId));\r
+               \r
                if ( recId.equals(toolBar.getSelectedRecorder()) ) {\r
                        // 選択中のレコーダのものは太字に\r
                        Font f = menuItem.getFont();\r
@@ -2488,7 +2413,7 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener {
                        rdialog.setOnlyUpdateExec(fexec);\r
                        rdialog.doUpdate();\r
                        \r
-                       if (rdialog.isReserved()) {\r
+                       if (rdialog.isSucceededReserve()) {\r
                                // 予約状況を更新\r
                                listed.updateReserveMark();\r
                                paper.updateReserveBorder(chnam);\r
@@ -2510,7 +2435,7 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener {
        /**\r
         *  予約実行をONOFFするメニューアイテム\r
         */\r
-       private JMenuItem getExecOnOffMenuItem(final boolean fexec, final String title, final String chnam, final String rsvId, final String recId, int n) {\r
+       private JMenuItem getExecOnOffMenuItem(final boolean fexec, final String start, final String title, final String chnam, final String rsvId, final String recId, int n) {\r
                \r
                JMenuItem menuItem = new JMenuItem();\r
                \r
@@ -2521,9 +2446,12 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener {
                }\r
                else {\r
                        mode = "OFF";\r
+                       menuItem.setForeground(Color.BLACK);\r
                }\r
-               \r
-               menuItem.setText(((n==0)?"予約を":"隣接予約を")+mode+"にする【"+title+"("+chnam+")/"+recId+")】");\r
+\r
+               String target = ( n==0 ) ? "予約" : "隣接予約";\r
+\r
+               menuItem.setText(String.format("%sを%sにする【%s - %s(%s)/%s】",target,mode,start,title,chnam,recId));\r
                \r
                if ( recId.equals(toolBar.getSelectedRecorder()) ) {\r
                        // 選択中のレコーダのものは太字に\r
@@ -2543,7 +2471,7 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener {
                                        rdialog.setOnlyUpdateExec( ! fexec);\r
                                        rdialog.doUpdate();\r
                                        \r
-                                       if (rdialog.isReserved()) {\r
+                                       if (rdialog.isSucceededReserve()) {\r
                                                // 予約状況を更新\r
                                                listed.updateReserveMark();\r
                                                paper.updateReserveBorder(chnam);\r
@@ -2569,7 +2497,7 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener {
         *  新聞形式へジャンプするメニューアイテム\r
         */\r
        private JMenuItem getJumpMenuItem(final String title, final String chnam, final String startDT) {\r
-               JMenuItem menuItem = new JMenuItem("番組欄へジャンプする【"+title+" ("+chnam+")】");\r
+               JMenuItem menuItem = new JMenuItem(String.format("番組欄へジャンプする【%s - %s(%s)】",startDT,title,chnam));\r
                menuItem.addActionListener(new ActionListener() {\r
                        public void actionPerformed(ActionEvent e) {\r
                                paper.jumpToBangumi(chnam,startDT);\r
@@ -2577,15 +2505,18 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener {
                });\r
                return menuItem;\r
        }\r
-       private JMenuItem getJumpToLastWeekMenuItem(final String title, final String chnam, final String startDT) {\r
+       private JMenuItem getJumpToLastWeekMenuItem( final String title, final String chnam, final String startDT) {\r
                GregorianCalendar cal = CommonUtils.getCalendar(startDT);\r
+               \r
                if ( cal != null ) {\r
-                       JMenuItem menuItem = new JMenuItem("先週の番組欄へジャンプする【"+title+" ("+chnam+")】");\r
                        cal.add(Calendar.DATE, -7);\r
-                       final String lastweek = CommonUtils.getDateTime(cal);\r
+                       final String lastdatetime = CommonUtils.getDateTimeW(cal);\r
+                       \r
+                       JMenuItem menuItem = new JMenuItem(String.format("先週の番組欄へジャンプする【%s - (%s)】",lastdatetime,chnam));\r
+                       \r
                        menuItem.addActionListener(new ActionListener() {\r
                                public void actionPerformed(ActionEvent e) {\r
-                                       paper.jumpToBangumi(chnam,lastweek);\r
+                                       paper.jumpToBangumi(chnam,lastdatetime);\r
                                }\r
                        });\r
                        return menuItem;\r
@@ -2593,85 +2524,6 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener {
                return null;\r
        }\r
        \r
-       // カーソル位置にかかる予約枠の検索\r
-       private void searchOverlapRsv(LikeReserveList overlapRsvList, ProgDetailList tvd, int h)\r
-       {\r
-               String clicked = "";\r
-               if ( h >= 0 && tvd.start.length() != 0 ) {\r
-                       // 新聞形式ならクリック位置の日時を算出する\r
-                       GregorianCalendar cala = CommonUtils.getCalendar(tvd.startDateTime);\r
-                       if ( CommonUtils.isLateNight(cala.get(Calendar.HOUR_OF_DAY)) ) {\r
-                               cala.set(Calendar.HOUR_OF_DAY, TIMEBAR_START);\r
-                               cala.set(Calendar.MINUTE, 0);\r
-                       }\r
-                       cala.add(Calendar.MINUTE, Math.round(h/bounds.getPaperHeightMultiplier()));\r
-                       clicked = CommonUtils.getDateTime(cala);\r
-                       //StdAppendError("clicked:"+clicked);\r
-               }\r
-               \r
-               HashMap<String,Boolean> misCN = new HashMap<String, Boolean>();\r
-               for ( HDDRecorder recorder : recorders ) {\r
-                       \r
-                       // 終了した予約を整理する\r
-                       recorder.refreshReserves();\r
-                       \r
-                       for ( ReserveList r : recorder.getReserves() ) {\r
-                               \r
-                               // 放送局のマッチング\r
-                               if (r.getCh_name() == null) {\r
-                                       if ( r.getChannel() == null ) {\r
-                                               System.err.println(ERRID+"予約情報にCHコードが設定されていません。バグの可能性があります。 recid="+recorder.Myself()+" chname="+r.getCh_name());\r
-                                               continue;\r
-                                       }\r
-                                       if(r.getChannel().length() > 0) {\r
-                                               misCN.put(r.getChannel(),true);\r
-                                       }\r
-                                       continue;\r
-                               }\r
-                               if ( ! r.getCh_name().equals(tvd.center)) {\r
-                                       continue;\r
-                               }\r
-                               \r
-                               // 重複時間チェック\r
-                               boolean inRange = false;\r
-                               long d = 0;\r
-                               {\r
-                                       ArrayList<String> starts = new ArrayList<String>();\r
-                                       ArrayList<String> ends = new ArrayList<String>();\r
-                                       CommonUtils.getStartEndList(starts, ends, r);\r
-                                       if ( h >= 0 ) {\r
-                                               // 新聞形式はピンポイント(マウスポインタのある位置の時刻)\r
-                                               for (int j=0; j<starts.size(); j++) {\r
-                                                       if ( clicked.compareTo(starts.get(j)) >= 0 && clicked.compareTo(ends.get(j)) <= 0 ) {\r
-                                                               inRange = true;\r
-                                                               break;\r
-                                                       }\r
-                                               }\r
-                                       }\r
-                                       else {\r
-                                               // リスト形式は幅がある(開始~終了までの間のいずれかの時刻)\r
-                                               for (int j=0; j<starts.size(); j++) {\r
-                                                       if ( CommonUtils.isOverlap(tvd.startDateTime, tvd.endDateTime, starts.get(j), ends.get(j), false) ) {\r
-                                                               inRange = true;\r
-                                                               d = CommonUtils.getDiffDateTime(tvd.startDateTime, starts.get(j));\r
-                                                               break;\r
-                                                       }\r
-                                               }\r
-                                       }\r
-                               }\r
-                               if ( ! inRange) {\r
-                                       continue;\r
-                               }\r
-                               \r
-                               // 類似予約あり!\r
-                               overlapRsvList.add(new LikeReserveItem(recorder, r, d));\r
-                       }\r
-               }\r
-               \r
-               return;\r
-       }\r
-       \r
-       \r
        /*******************************************************************************\r
         * タイマー関連\r
         ******************************************************************************/\r
@@ -3115,7 +2967,7 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener {
        private void loadTVProgramOnce(TVProgram tvp, String sType, String aName, boolean loadonly, boolean force) {\r
                \r
                final String FUNCID = "[Web番組表取得] ";\r
-               final String ERRID = "[ERROR]"+FUNCID;\r
+//             final String ERRID = "[ERROR]"+FUNCID;\r
                \r
                // ログ\r
                String msg = FUNCID+sType+"を取得します: "+tvp.getTVProgramId();\r
index ca023c6..5c2eeaa 100644 (file)
@@ -15,6 +15,8 @@
 \r
 【番組追跡】リピート放送検出の改善>番組追跡履歴の保存  →帯での再放送だと、リピート放送検出がうまくないので\r
 \r
+【キーワード検索】ダイアログがなんかおかしい(条件の二重登録?) →登録ラベルの重複チェックが行えていない既存バグのせいだった\r
+\r
 ---優先度高\r
 \r
 【自動予約登録】EDCBとTVRockの自動予約登録編集機能の追加(~6月中旬厳守) やばい!やばい!やばい!\r