OSDN Git Service

キーワード検索の条件追加ほか
[tainavi/TinyBannavi.git] / TinyBannavi / src / tainavi / RecSettingEditorPanel.java
1 package tainavi;\r
2 \r
3 import java.awt.Color;\r
4 import java.awt.Dimension;\r
5 import java.awt.ItemSelectable;\r
6 import java.awt.event.ActionEvent;\r
7 import java.awt.event.ActionListener;\r
8 import java.awt.event.ItemEvent;\r
9 import java.awt.event.ItemListener;\r
10 import java.util.ArrayList;\r
11 \r
12 import javax.swing.JButton;\r
13 import javax.swing.JLabel;\r
14 import javax.swing.JPanel;\r
15 import javax.swing.SpringLayout;\r
16 import javax.swing.border.LineBorder;\r
17 \r
18 import tainavi.TVProgram.ProgGenre;\r
19 import tainavi.TVProgram.ProgSubgenre;\r
20 \r
21 \r
22 /**\r
23  * 予約ダイアログを目的ごとに3ブロックにわけたうちの「録画設定」部分のコンポーネント\r
24  * @since 3.22.2β\r
25  */\r
26 public class RecSettingEditorPanel extends JPanel {\r
27 \r
28         private static final long serialVersionUID = 1L;\r
29         \r
30         public void setDebug(boolean b) { debug = b; }\r
31         private static boolean debug = false;\r
32 \r
33         /*******************************************************************************\r
34          * 定数\r
35          ******************************************************************************/\r
36         \r
37         private static final String ITEM_YES = "する";\r
38         private static final String ITEM_NO = "しない";\r
39         \r
40         private static final int PARTS_HEIGHT = 25;\r
41         private static final int SEP_WIDTH = 10;\r
42         private static final int SEP_WIDTH_NARROW = 5;\r
43         private static final int SEP_HEIGHT = 10;\r
44         private static final int SEP_HEIGHT_NALLOW = 5;\r
45         \r
46         private static final int LABEL_WIDTH = 150;\r
47         private static final int BUTTON_WIDTH = 75;\r
48         \r
49         private static final int COMBO_WIDTH = 115;\r
50         private static final int COMBO_WIDTH_WIDE = 155;\r
51         private static final int COMBO_HEIGHT = 43;\r
52 \r
53         private static final int RECORDER_WIDTH = COMBO_WIDTH_WIDE*2+SEP_WIDTH_NARROW;\r
54         private static final int ENCODER_WIDTH = COMBO_WIDTH*2+SEP_WIDTH_NARROW;\r
55 \r
56         private static final String TEXT_SAVEDEFAULT = "<HTML>録画設定を開いた時の枠内のデフォルト値として<BR>現在の値を使用するようにします。<BR><FONT COLOR=#FF0000>※ジャンル別AV設定があればそちらが優先されます。</FONT></HTML>";\r
57 \r
58         // ログ関連\r
59         \r
60         private static final String MSGID = "[録画設定編集] ";\r
61         private static final String ERRID = "[ERROR]"+MSGID;\r
62         private static final String DBGID = "[DEBUG]"+MSGID;\r
63         \r
64         /*******************************************************************************\r
65          * 部品\r
66          ******************************************************************************/\r
67         \r
68         private JComboBoxPanel jCBXPanel_recorder = null;\r
69         private JComboBoxPanel jCBXPanel_encoder = null;\r
70         private JLabel jLabel_encoderemptywarn = null;\r
71         \r
72         private JComboBoxPanel jCBXPanel_genre = null;\r
73         private JComboBoxPanel jCBXPanel_subgenre = null;\r
74         private JComboBoxPanel jCBXPanel_videorate = null;\r
75         private JComboBoxPanel jCBXPanel_audiorate = null;\r
76         private JComboBoxPanel jCBXPanel_folder = null;\r
77         private JComboBoxPanel jCBXPanel_dvdcompat = null;\r
78         private JComboBoxPanel jCBXPanel_device = null;\r
79         private JComboBoxPanel jCBXPanel_aspect = null;\r
80         private JComboBoxPanel jCBXPanel_bvperf = null;\r
81         private JComboBoxPanel jCBXPanel_lvoice = null;\r
82         private JComboBoxPanel jCBXPanel_autodel = null;\r
83         private JComboBoxPanel jCBXPanel_pursues = null;\r
84         private JComboBoxPanel jCBXPanel_xChapter = null;\r
85         private JComboBoxPanel jCBXPanel_msChapter = null;\r
86         private JComboBoxPanel jCBXPanel_mvChapter = null;\r
87         \r
88         private JLabel jLabel_rectype = null;\r
89         private JButton jButton_load = null;\r
90         private JButton jButton_save = null;\r
91         private JButton jButton_savedefault = null;\r
92         \r
93         private JCheckBoxPanel jCheckBox_Exec = null;\r
94 \r
95         //\r
96         private RecSettingSelectable recsetsel = null;\r
97         \r
98         \r
99         /*******************************************************************************\r
100          * コンストラクタ\r
101          ******************************************************************************/\r
102         \r
103         public RecSettingEditorPanel() {\r
104 \r
105                 super();\r
106                 setBorder(new LineBorder(Color.BLACK, 1));\r
107                 \r
108                 addComponents();\r
109                 \r
110                 // 外部要因に左右されないアイテム群の設定\r
111                 setGenreItems();\r
112                 \r
113                 // 付けたり外したりしないリスナー\r
114                 jCBXPanel_genre.addItemListener(f_il_resetSubgenreItems);\r
115                 \r
116                 jButton_load.addActionListener(f_al_loadAction);\r
117                 jButton_save.addActionListener(f_al_saveAction);\r
118                 jButton_savedefault.addActionListener(f_al_saveDefaultAction);\r
119                 jCBXPanel_audiorate.addItemListener(f_il_arateChanged);\r
120                 \r
121                 // 付けたり外したりするリスナー\r
122                 setEnabledListenerAll(true);\r
123         }\r
124         \r
125         private void addComponents() {\r
126                 \r
127                 setLayout(new SpringLayout());\r
128                 \r
129                 int y = 0;\r
130                 int x = SEP_WIDTH_NARROW;\r
131                 \r
132                 CommonSwingUtils.putComponentOn(this, jCBXPanel_recorder = new JComboBoxPanel("",RECORDER_WIDTH,RECORDER_WIDTH),        RECORDER_WIDTH+5,       COMBO_HEIGHT+SEP_HEIGHT, x, y);\r
133                 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
134                 CommonSwingUtils.putComponentOn(this, jLabel_encoderemptywarn = new JLabel(""), LABEL_WIDTH, PARTS_HEIGHT, x+=ENCODER_WIDTH+5+SEP_WIDTH+5, y+PARTS_HEIGHT);\r
135                 \r
136                 jCBXPanel_recorder.getJComboBox().setForeground(Color.BLUE);\r
137                 jCBXPanel_encoder.getJComboBox().setForeground(Color.BLUE);\r
138                 \r
139                 // ポップアップした時に追加される幅\r
140                 jCBXPanel_recorder.addPopupWidth(100);\r
141                 jCBXPanel_encoder.addPopupWidth(100);\r
142 \r
143                 y += (COMBO_HEIGHT+SEP_HEIGHT)+SEP_HEIGHT;\r
144                 x = SEP_WIDTH_NARROW;\r
145                 CommonSwingUtils.putComponentOn(this, jCBXPanel_genre = new JComboBoxPanel("",110,150),         COMBO_WIDTH_WIDE,       COMBO_HEIGHT, x, y);\r
146                 CommonSwingUtils.putComponentOn(this, jCBXPanel_subgenre = new JComboBoxPanel("",110,150),      COMBO_WIDTH_WIDE,       COMBO_HEIGHT, x+=(COMBO_WIDTH_WIDE+SEP_WIDTH), y);\r
147                 CommonSwingUtils.putComponentOn(this, jCBXPanel_autodel = new JComboBoxPanel("",110,110),       COMBO_WIDTH,            COMBO_HEIGHT, x+=(COMBO_WIDTH+SEP_WIDTH)*2, y);\r
148                 CommonSwingUtils.putComponentOn(this, jCBXPanel_xChapter = new JComboBoxPanel("",110,110),      COMBO_WIDTH,            COMBO_HEIGHT, x+=(COMBO_WIDTH+SEP_WIDTH), y);\r
149                 \r
150                 y += COMBO_HEIGHT;\r
151                 x = SEP_WIDTH_NARROW;\r
152                 CommonSwingUtils.putComponentOn(this, jCBXPanel_videorate = new JComboBoxPanel("",110,150),     COMBO_WIDTH_WIDE,       COMBO_HEIGHT, x, y);\r
153                 CommonSwingUtils.putComponentOn(this, jCBXPanel_audiorate = new JComboBoxPanel("",110,110),     COMBO_WIDTH,            COMBO_HEIGHT, x+=(COMBO_WIDTH_WIDE+SEP_WIDTH), y);\r
154                 CommonSwingUtils.putComponentOn(this, jCBXPanel_bvperf = new JComboBoxPanel("",110,110),        COMBO_WIDTH,            COMBO_HEIGHT, x+=(COMBO_WIDTH+SEP_WIDTH), y);\r
155                 CommonSwingUtils.putComponentOn(this, jCBXPanel_lvoice = new JComboBoxPanel("",110,110),        COMBO_WIDTH,            COMBO_HEIGHT, x+=(COMBO_WIDTH+SEP_WIDTH), y);\r
156                 CommonSwingUtils.putComponentOn(this, jCBXPanel_msChapter = new JComboBoxPanel("",110,110),     COMBO_WIDTH,            COMBO_HEIGHT, x+=(COMBO_WIDTH+SEP_WIDTH), y);\r
157                 \r
158                 y += COMBO_HEIGHT;\r
159                 x = SEP_WIDTH_NARROW;\r
160                 CommonSwingUtils.putComponentOn(this, jCBXPanel_folder = new JComboBoxPanel("",100,150),        COMBO_WIDTH_WIDE,       COMBO_HEIGHT, x, y);\r
161                 CommonSwingUtils.putComponentOn(this, jCBXPanel_device = new JComboBoxPanel("",110,110),        COMBO_WIDTH,            COMBO_HEIGHT, x+=(COMBO_WIDTH_WIDE+SEP_WIDTH), y);\r
162                 CommonSwingUtils.putComponentOn(this, jCBXPanel_dvdcompat = new JComboBoxPanel("",110,110),     COMBO_WIDTH,            COMBO_HEIGHT, x+=(COMBO_WIDTH+SEP_WIDTH), y);\r
163                 CommonSwingUtils.putComponentOn(this, jCBXPanel_aspect = new JComboBoxPanel("",110,110),        COMBO_WIDTH,            COMBO_HEIGHT, x+=(COMBO_WIDTH+SEP_WIDTH), y);\r
164                 CommonSwingUtils.putComponentOn(this, jCBXPanel_mvChapter = new JComboBoxPanel("",110,110),     COMBO_WIDTH,            COMBO_HEIGHT, x+=(COMBO_WIDTH+SEP_WIDTH), y);\r
165 \r
166                 y += COMBO_HEIGHT;\r
167                 CommonSwingUtils.putComponentOn(this, jCBXPanel_pursues = new JComboBoxPanel("",110,110),       COMBO_WIDTH,            COMBO_HEIGHT, x, y);\r
168                 \r
169                 y += COMBO_HEIGHT;\r
170                 \r
171                 // 特殊配置\r
172                 {\r
173                         int spy = SEP_HEIGHT_NALLOW+(PARTS_HEIGHT+SEP_HEIGHT_NALLOW)*2;\r
174                         x = SEP_WIDTH_NARROW+(COMBO_WIDTH_WIDE+SEP_WIDTH)+(COMBO_WIDTH+SEP_WIDTH)*4+SEP_WIDTH;\r
175                         \r
176                         CommonSwingUtils.putComponentOn(this, jLabel_rectype = new JLabel("ジャンル別の"), LABEL_WIDTH, PARTS_HEIGHT, x, spy);\r
177                         \r
178                         spy+=PARTS_HEIGHT-5;\r
179                         \r
180                         CommonSwingUtils.putComponentOn(this, new JLabel("録画設定の選択"),      LABEL_WIDTH,  PARTS_HEIGHT, x, spy);\r
181                         CommonSwingUtils.putComponentOn(this, jButton_load = new JButton("開く"),                             BUTTON_WIDTH, PARTS_HEIGHT, x+SEP_WIDTH_NARROW, spy+=PARTS_HEIGHT);\r
182                         CommonSwingUtils.putComponentOn(this, jButton_save = new JButton("保存"),                     BUTTON_WIDTH, PARTS_HEIGHT, x+SEP_WIDTH_NARROW, spy+=PARTS_HEIGHT);\r
183                         CommonSwingUtils.putComponentOn(this, jButton_savedefault = new JButton("既定化"),   BUTTON_WIDTH, PARTS_HEIGHT, x+SEP_WIDTH_NARROW, spy+=(PARTS_HEIGHT+SEP_HEIGHT));\r
184                         \r
185                         jButton_savedefault.setToolTipText(TEXT_SAVEDEFAULT);\r
186                         \r
187                         CommonSwingUtils.putComponentOn(this, jCheckBox_Exec = new JCheckBoxPanel("予約実行",75,true), 75, PARTS_HEIGHT, x+SEP_WIDTH_NARROW, spy+=(PARTS_HEIGHT+SEP_HEIGHT));\r
188                         setExecValue(true);\r
189                 }\r
190                 \r
191                 x+=BUTTON_WIDTH+SEP_WIDTH_NARROW*2;\r
192                 \r
193                 Dimension d = new Dimension(x,y);\r
194                 setPreferredSize(d);\r
195         }\r
196         \r
197         public void setRecSettingSelector(RecSettingSelectable o) {\r
198                 recsetsel = o;\r
199         }\r
200         \r
201         \r
202         /*******************************************************************************\r
203          * アイテムの設定\r
204          ******************************************************************************/\r
205         \r
206         /***************************************\r
207          * 項目ラベルの設定\r
208          **************************************/\r
209         \r
210         /**\r
211          * レコーダが選択されたら各コンポーネントラベルを設定する\r
212          * @param recorder\r
213          */\r
214         public void setLabels(HDDRecorder recorder) {\r
215                 \r
216                 // 固定ラベル\r
217                 setLabel(jCBXPanel_recorder,    null,                                                   "レコーダ");\r
218                 setLabel(jCBXPanel_encoder,             null,                                                   "エンコーダ");\r
219                 setLabel(jCBXPanel_genre,               null,                                                   "ジャンル");\r
220                 setLabel(jCBXPanel_subgenre,    null,                                                   "サブジャンル");\r
221                 setLabel(jCBXPanel_pursues,             null,                                                   "番組追従");\r
222                 \r
223                 // 可変ラベル\r
224                 setLabel(jCBXPanel_videorate,   recorder.getLabel_Videorate(),  "画質");\r
225                 setLabel(jCBXPanel_audiorate,   recorder.getLabel_Audiorate(),  "音質");\r
226                 \r
227                 setLabel(jCBXPanel_folder,              recorder.getLabel_Folder(),             "記録先フォルダ");\r
228                 setLabel(jCBXPanel_device,              recorder.getLabel_Device(),             "記録先デバイス");\r
229                 \r
230                 setLabel(jCBXPanel_bvperf,              recorder.getLabel_BVperf(),             "録画優先度");             // "高レート節約"?\r
231                 setLabel(jCBXPanel_dvdcompat,   recorder.getLabel_DVDCompat(),  "BD/DVD互換モード");\r
232                 \r
233                 setLabel(jCBXPanel_autodel,             recorder.getLabel_Autodel(),    "自動削除");\r
234                 setLabel(jCBXPanel_lvoice,              recorder.getLabel_LVoice(),             "ライン音声選択");\r
235                 setLabel(jCBXPanel_aspect,              recorder.getLabel_Aspect(),             "録画のりしろ");          // "DVD記録時画面比"?\r
236                 \r
237                 setLabel(jCBXPanel_msChapter,   recorder.getLabel_MsChapter(),  "マジックチャプタ(シーン)");   // "DVD/シーンチャプタ分割"?\r
238                 setLabel(jCBXPanel_mvChapter,   recorder.getLabel_MvChapter(),  "マジックチャプタ(本編)");      // "音多/本編チャプタ分割"?\r
239                 setLabel(jCBXPanel_xChapter,    recorder.getLabel_XChapter(),   "無音部分チャプタ分割");\r
240         }\r
241 \r
242         /**\r
243          * ジャンル別AV設定か、CH別AV設定かを選ぶ\r
244          */\r
245         public void setAVCHSetting(boolean enabled) {\r
246                 jLabel_rectype.setText(enabled ? "放送局別の" : "ジャンル別の");\r
247         }\r
248         \r
249         /***************************************\r
250          * 固定アイテムの設定\r
251          **************************************/\r
252         \r
253         /**\r
254          * 固定のアイテムを設定する\r
255          * @see #setFlexItems(HDDRecorder, String)\r
256          */\r
257         public void setFixedItems(HDDRecorderList recorders) {\r
258                 \r
259                 setEnabledListenerAll(false);   // リスナー停止\r
260                 \r
261                 setRecorderItems(recorders);\r
262                 \r
263                 setEnabledListenerAll(true);    // リスナー再開\r
264         }\r
265         \r
266         /**\r
267          * レコーダアイテムを設定する\r
268          * @see #setFixedItems(HDDRecorderList)\r
269          */\r
270         private void setRecorderItems(HDDRecorderList recorders) {\r
271                 String selected = (String) jCBXPanel_recorder.getSelectedItem();\r
272                 ArrayList<String> items = new ArrayList<String>();\r
273                 for ( HDDRecorder rec : recorders ) {\r
274                         if ( rec.isBackgroundOnly() ) {\r
275                                 continue;       // Googleカレンダープラグインとかははずす\r
276                         }\r
277                         items.add(rec.Myself());\r
278                 }\r
279                 \r
280                 setComboItems(jCBXPanel_recorder, items);\r
281                 \r
282                 if ( selected != null ) {\r
283                         // 入れ替え後に元に戻してみる\r
284                         jCBXPanel_recorder.setSelectedItem(selected);\r
285                 }\r
286         }\r
287         \r
288         /**\r
289          * ジャンルアイテムを設定する\r
290          * @see #setFixedItems(HDDRecorderList)\r
291          */\r
292         private void setGenreItems() {\r
293                 ArrayList<String> items = new ArrayList<String>();\r
294                 for ( ProgGenre g : ProgGenre.values() ) {\r
295                         items.add(g.toString());\r
296                 }\r
297                 \r
298                 setComboItems(jCBXPanel_genre, items);\r
299         }\r
300         \r
301         \r
302         /***************************************\r
303          * 可変アイテムの設定\r
304          **************************************/\r
305         \r
306         /**\r
307          * レコーダが選択されたらそれにあわせて各コンポーネントアイテムを設定する\r
308          */\r
309         public void setFlexItems(HDDRecorder recorder, String webChName) {\r
310                 \r
311                 setEnabledListenerAll(false);   // リスナー停止 \r
312                 \r
313                 // エンコーダ\r
314                 setComboItems(jCBXPanel_encoder, recorder.getFilteredEncoders(webChName));\r
315                 \r
316                 // 設定値\r
317                 setComboItems(jCBXPanel_videorate, recorder.getVideoRateList());\r
318                 setComboItems(jCBXPanel_audiorate, recorder.getAudioRateList());\r
319                 setComboItems(jCBXPanel_folder, recorder.getFolderList());\r
320                 \r
321                 setComboItems(jCBXPanel_device, recorder.getDeviceList());\r
322                 setComboItems(jCBXPanel_bvperf, recorder.getBVperf());\r
323                 setComboItems(jCBXPanel_dvdcompat, recorder.getDVDCompatList());\r
324                 \r
325                 setComboItems(jCBXPanel_autodel, recorder.getAutodel());\r
326                 setComboItems(jCBXPanel_lvoice, recorder.getLVoice());\r
327                 setComboItems(jCBXPanel_aspect, recorder.getAspect());\r
328                 \r
329                 setComboItems(jCBXPanel_msChapter, recorder.getMsChapter());\r
330                 setComboItems(jCBXPanel_mvChapter, recorder.getMvChapter());\r
331                 setComboItems(jCBXPanel_xChapter, recorder.getXChapter());\r
332 \r
333                 setComboItems(jCBXPanel_pursues, null);\r
334                 \r
335                 setEnabledListenerAll(true);    // リスナー再開\r
336         }\r
337         \r
338         /**\r
339          * ジャンルが選択されたらそれにあわせてサブジャンルアイテムを設定する\r
340          * @see #setGenreItems()\r
341          */\r
342         private void setSubgenreItems(ProgGenre genre) {\r
343                 ArrayList<String> items = new ArrayList<String>();\r
344                 for ( ProgSubgenre sg : ProgSubgenre.values(genre) ) {\r
345                         items.add(sg.toString());\r
346                 }\r
347                 \r
348                 setComboItems(jCBXPanel_subgenre, items);\r
349         }\r
350         \r
351         /**\r
352          * 優先的に使用するチューナーを前に持ってくる\r
353          */\r
354         public void sortEncoderItems(ArrayList<TextValueSet> preferred) {\r
355                 \r
356                 ArrayList<String> tmpList = new ArrayList<String>(); \r
357                 for ( int i=0; i<jCBXPanel_encoder.getItemCount(); i++ ) {\r
358                         tmpList.add((String) jCBXPanel_encoder.getItemAt(i));\r
359                 }\r
360                 \r
361                 ArrayList<String> items = new ArrayList<String>();\r
362                 for ( String enc : tmpList ) {\r
363                         for ( TextValueSet tv : preferred ) {\r
364                                 if ( tv.getText().equals(enc) ) {\r
365                                         // 見つかったからついかー\r
366                                         items.add(enc);\r
367                                         break;\r
368                                 }\r
369                         }\r
370                 }\r
371                 for ( String enc : items ) {\r
372                         tmpList.remove(enc);\r
373                 }\r
374                 \r
375                 for ( String enc : tmpList ) {\r
376                         items.add(enc);\r
377                 }\r
378                 \r
379                 setComboItems(jCBXPanel_encoder, items);\r
380         }\r
381         \r
382         /*******************************************************************************\r
383          * 共通部品的な\r
384          ******************************************************************************/\r
385 \r
386         /**\r
387          * コンボボックスのアイテム登録を行う\r
388          */\r
389         private <T> int setComboItems(JComboBoxPanel combo, ArrayList<T> items) {\r
390                 \r
391                 combo.removeAllItems();\r
392                 \r
393                 if ( items == null ) {\r
394                         // ここにくるのは番組追従のみかな?\r
395                         combo.addItem(ITEM_YES);\r
396                         combo.addItem(ITEM_NO);\r
397                         combo.setEnabled(true);\r
398                         return combo.getItemCount();\r
399                 }\r
400 \r
401                 if ( items.size() == 0 ) {\r
402                         combo.setEnabled(false);\r
403                         return 0;\r
404                 }\r
405         \r
406                 // うひー\r
407                 for ( T enc : items ) {\r
408                         if ( enc.getClass() == TextValueSet.class ) {\r
409                                 TextValueSet t = (TextValueSet) enc;\r
410                                 combo.addItem(t.getText());\r
411                                 \r
412                                 if (t.getDefval()) combo.setSelectedIndex(combo.getItemCount()-1);      // デフォルト値があるならば\r
413                         }\r
414                         else if ( enc.getClass() == String.class ) {\r
415                                 // レコーダ・エンコーダのみかな?\r
416                                 combo.addItem((String) enc);\r
417                         }\r
418                 }\r
419                 combo.setEnabled(combo.getItemCount() > 1);\r
420                 return combo.getItemCount();\r
421         }\r
422 \r
423         private void setLabel(JComboBoxPanel combo, String overrideLabel, String defaultLabel) {\r
424                 combo.setText((overrideLabel!=null)?overrideLabel:defaultLabel);\r
425         }\r
426         \r
427         /*******************************************************************************\r
428          * 外部とのやり取り(設定反映系)\r
429          ******************************************************************************/\r
430 \r
431         /***************************************\r
432          * 設定の一括反映3種\r
433          **************************************/\r
434         \r
435         /**\r
436          * 番組情報によるアイテム選択\r
437          */\r
438         public void setSelectedValues(ProgDetailList tvd, ReserveList r) {\r
439                 \r
440                 setEnabledListenerAll(false);\r
441                 \r
442                 // サブジャンルアイテム群はジャンル決定後に埋まる\r
443                 setSelectedGenreValues((tvd.genre!=null?tvd.genre.toString():null), (tvd.subgenre!=null?tvd.subgenre.toString():null));\r
444                 \r
445                 // チューナー\r
446                 setSelectedEncoderValue(r.getTuner());  // encがnullかどうかはメソッドの中で確認するよ\r
447                 \r
448                 // 番組追従(これは予約種別[arate]より先に設定しておかないといけない)\r
449                 setSelectedValue(jCBXPanel_pursues, r.getPursues() ? ITEM_YES : ITEM_NO);\r
450                 \r
451                 // 画質・音質\r
452                 setSelectedValue(jCBXPanel_videorate, r.getRec_mode());\r
453                 setSelectedValue(jCBXPanel_audiorate, r.getRec_audio());\r
454                 setSelectedValue(jCBXPanel_folder, r.getRec_folder());\r
455                 // サブジャンルは番組情報から\r
456                 setSelectedValue(jCBXPanel_dvdcompat, r.getRec_dvdcompat());\r
457                 setSelectedValue(jCBXPanel_device, r.getRec_device());\r
458                 \r
459                 // 自動チャプタ関連\r
460                 setSelectedValue(jCBXPanel_xChapter, r.getRec_xchapter());\r
461                 setSelectedValue(jCBXPanel_msChapter, r.getRec_mschapter());\r
462                 setSelectedValue(jCBXPanel_mvChapter, r.getRec_mvchapter());\r
463                 \r
464                 // その他\r
465                 setSelectedValue(jCBXPanel_aspect, r.getRec_aspect());\r
466                 setSelectedValue(jCBXPanel_bvperf, r.getRec_bvperf());\r
467                 setSelectedValue(jCBXPanel_lvoice, r.getRec_lvoice());\r
468                 setSelectedValue(jCBXPanel_autodel, r.getRec_autodel());\r
469                 \r
470                 // 実行ON・OFF\r
471                 setExecValue(r.getExec());\r
472                 \r
473                 setEnabledListenerAll(true);\r
474         }\r
475         \r
476         /**\r
477          * 類似予約情報によるアイテム選択\r
478          */\r
479         public void setSelectedValues(ReserveList r) {\r
480 \r
481                 setEnabledListenerAll(false);\r
482 \r
483                 // サブジャンルアイテム群はジャンル決定後に埋まる\r
484                 setSelectedGenreValues(r.getRec_genre(), r.getRec_genre());\r
485 \r
486                 // チューナー\r
487                 setSelectedValue(jCBXPanel_encoder, r.getTuner());\r
488                 \r
489                 // 番組追従(これは予約種別[arate]より先に設定しておかないといけない)\r
490                 setSelectedValue(jCBXPanel_pursues, r.getPursues() ? ITEM_YES : ITEM_NO);\r
491                 \r
492                 // 画質・音質\r
493                 setSelectedValue(jCBXPanel_videorate, r.getRec_mode());\r
494                 setSelectedValue(jCBXPanel_audiorate, r.getRec_audio());\r
495                 setSelectedValue(jCBXPanel_folder, r.getRec_folder());\r
496                 setSelectedValue(jCBXPanel_subgenre, r.getRec_subgenre());\r
497                 setSelectedValue(jCBXPanel_dvdcompat, r.getRec_dvdcompat());\r
498                 setSelectedValue(jCBXPanel_device, r.getRec_device());\r
499                 \r
500                 // 自動チャプタ関連\r
501                 setSelectedValue(jCBXPanel_xChapter, r.getRec_xchapter());\r
502                 setSelectedValue(jCBXPanel_msChapter, r.getRec_mschapter());\r
503                 setSelectedValue(jCBXPanel_mvChapter, r.getRec_mvchapter());\r
504                 \r
505                 // その他\r
506                 setSelectedValue(jCBXPanel_aspect, r.getRec_aspect());\r
507                 setSelectedValue(jCBXPanel_bvperf, r.getRec_bvperf());\r
508                 setSelectedValue(jCBXPanel_lvoice, r.getRec_lvoice());\r
509                 setSelectedValue(jCBXPanel_autodel, r.getRec_autodel());\r
510                 \r
511                 // 実行ON・OFF\r
512                 setExecValue(r.getExec());\r
513                 \r
514                 setEnabledListenerAll(true);\r
515         }\r
516         \r
517         /**\r
518          * ジャンル別AV設定によるアイテム選択\r
519          */\r
520         public void setSelectedValues(AVs avs) {\r
521                 \r
522                 setEnabledListenerAll(false);\r
523                 \r
524                 // 画質・音質\r
525                 setSelectedValue(jCBXPanel_videorate, avs.getVideorate());\r
526                 setSelectedValue(jCBXPanel_audiorate, avs.getAudiorate());\r
527                 setSelectedValue(jCBXPanel_folder, avs.getFolder());\r
528                 // サブジャンルは確定済み\r
529                 setSelectedValue(jCBXPanel_dvdcompat, avs.getDVDCompat());\r
530                 setSelectedValue(jCBXPanel_device, avs.getDevice());\r
531                 \r
532                 // 自動チャプタ関連\r
533                 setSelectedValue(jCBXPanel_xChapter, avs.getXChapter());\r
534                 setSelectedValue(jCBXPanel_msChapter, avs.getMsChapter());\r
535                 setSelectedValue(jCBXPanel_mvChapter, avs.getMvChapter());\r
536                 \r
537                 // その他\r
538                 setSelectedValue(jCBXPanel_aspect, avs.getAspect());\r
539                 setSelectedValue(jCBXPanel_bvperf, avs.getBvperf());\r
540                 setSelectedValue(jCBXPanel_lvoice, avs.getLvoice());\r
541                 setSelectedValue(jCBXPanel_autodel, avs.getAutodel());\r
542                 \r
543                 setEnabledListenerAll(true);\r
544         }\r
545         \r
546         /***************************************\r
547          * 設定の部分反映各種 \r
548          **************************************/\r
549         \r
550         /**\r
551          * 実行ON・OFFの強制設定\r
552          */\r
553         public void setExecValue(boolean b) {\r
554                 jCheckBox_Exec.setSelected(b);\r
555                 jCheckBox_Exec.setForeground(b ? Color.BLACK : Color.RED);\r
556         }\r
557         \r
558         /**\r
559          * レコーダのアイテム選択(中から呼んじゃだめだよ)\r
560          * <P>これを呼び出した場合、レコーダ選択イベントは起きないので選択結果は呼び出し元で保存しておく必要がある\r
561          * <P>これは他のコンポーネントがトリガーとなって起きるイベントから呼び出されるのでリスナーは動かしておかないといけない \r
562          */\r
563         public String setSelectedRecorderValue(String myself) {\r
564                 return setSelectedValue(jCBXPanel_recorder, myself);\r
565         }\r
566         \r
567         /**\r
568          * エンコーダのアイテム選択\r
569          */\r
570         public String setSelectedEncoderValue(String enc) {\r
571                 \r
572                 if ( enc == null ) {\r
573                         jCBXPanel_encoder.setSelectedIndex(0);\r
574                         jLabel_encoderemptywarn.setText("空きエンコーダ検索無効");\r
575                         jLabel_encoderemptywarn.setForeground(Color.CYAN);\r
576                 }\r
577                 else if ( enc.length() == 0 ) {\r
578                         jCBXPanel_encoder.setSelectedIndex(0);\r
579                         jLabel_encoderemptywarn.setText("空きエンコーダ不足");\r
580                         jLabel_encoderemptywarn.setForeground(Color.RED);\r
581                 }\r
582                 else {\r
583                         jCBXPanel_encoder.setSelectedItem(enc);\r
584                         jLabel_encoderemptywarn.setText("空きエンコーダあり");\r
585                         jLabel_encoderemptywarn.setForeground(Color.BLUE);\r
586                 }\r
587                 \r
588                 return (String) jCBXPanel_encoder.getSelectedItem();\r
589         }\r
590         \r
591         /**\r
592          * Vrateのアイテム選択(中から呼んじゃだめだよ)\r
593          */\r
594         public String setSelectedVrateValue(String vrate) {\r
595                 \r
596                 if ( vrate == null ) {\r
597                         return null;\r
598                 }\r
599                 \r
600                 return setSelectedValue(jCBXPanel_videorate, vrate);\r
601         }\r
602         \r
603         /**\r
604          * ジャンルアイテムの選択\r
605          */\r
606         private String setSelectedGenreValues(String genre, String subgenre) {\r
607                 \r
608                 if ( genre == null || genre.length() == 0 ) {\r
609                         genre = ProgGenre.NOGENRE.toString();\r
610                 }\r
611                 jCBXPanel_genre.setSelectedItem(genre);\r
612                 \r
613                 if ( subgenre == null || subgenre.length() == 0 ) {\r
614                         jCBXPanel_subgenre.setSelectedIndex(0);\r
615                 }\r
616                 else {\r
617                         jCBXPanel_subgenre.setSelectedItem(subgenre);\r
618                 }\r
619                 \r
620                 return (String) jCBXPanel_genre.getSelectedItem();\r
621         }\r
622         \r
623         /**\r
624          * アイテム選択\r
625          */\r
626         private String setSelectedValue(JComboBoxPanel comp, String value) {\r
627                 \r
628                 if ( value != null ) {\r
629                         comp.setSelectedItem(value);\r
630                 }\r
631                 else if ( comp.getItemCount() > 0 ){\r
632                         comp.setSelectedIndex(0);\r
633                 }\r
634                 \r
635                 return (String) comp.getSelectedItem();\r
636         }\r
637         \r
638         /*******************************************************************************\r
639          * 外部とのやり取り(設定取得系)\r
640          ******************************************************************************/\r
641         \r
642         /***************************************\r
643          * 取得系\r
644          **************************************/\r
645         \r
646         /**\r
647          * 選択値を予約情報に代入する\r
648          */\r
649         public ReserveList getSelectedValues(ReserveList r) {\r
650                 \r
651                 r.setTuner((String) jCBXPanel_encoder.getSelectedItem());\r
652                 \r
653                 r.setRec_mode((String) jCBXPanel_videorate.getSelectedItem());\r
654                 r.setRec_audio((String) jCBXPanel_audiorate.getSelectedItem());\r
655                 r.setRec_folder((String) jCBXPanel_folder.getSelectedItem());\r
656                 r.setRec_genre((String) jCBXPanel_genre.getSelectedItem());\r
657                 r.setRec_subgenre((String) jCBXPanel_subgenre.getSelectedItem());\r
658                 r.setRec_dvdcompat((String) jCBXPanel_dvdcompat.getSelectedItem());\r
659                 r.setRec_device((String) jCBXPanel_device.getSelectedItem());\r
660                 \r
661                 // 自動チャプタ関連\r
662                 r.setRec_xchapter((String) jCBXPanel_xChapter.getSelectedItem());\r
663                 r.setRec_mschapter((String) jCBXPanel_msChapter.getSelectedItem());\r
664                 r.setRec_mvchapter((String) jCBXPanel_mvChapter.getSelectedItem());\r
665                 \r
666                 // その他\r
667                 r.setRec_aspect((String) jCBXPanel_aspect.getSelectedItem());\r
668                 r.setRec_bvperf((String) jCBXPanel_bvperf.getSelectedItem());\r
669                 r.setRec_lvoice((String) jCBXPanel_lvoice.getSelectedItem());\r
670                 r.setRec_autodel((String) jCBXPanel_autodel.getSelectedItem());\r
671                 \r
672                 // 番組追従\r
673                 r.setPursues(ITEM_YES == jCBXPanel_pursues.getSelectedItem());\r
674                 \r
675                 // 実行ON・OFF\r
676                 r.setExec(jCheckBox_Exec.isSelected());\r
677                 \r
678                 return r;\r
679         }\r
680         \r
681         public ReserveList getSelectedValues() {\r
682                 return getSelectedValues(new ReserveList());\r
683         }\r
684         \r
685         /**\r
686          * 選択値をジャンル別録画設定情報に代入する\r
687          */\r
688         public AVs getSelectedSetting(AVs c) {\r
689 \r
690                 c.setGenre((String) jCBXPanel_genre.getSelectedItem());\r
691                 \r
692                 c.setVideorate((String) jCBXPanel_videorate.getSelectedItem());\r
693                 c.setAudiorate((String) jCBXPanel_audiorate.getSelectedItem());\r
694                 c.setFolder((String) jCBXPanel_folder.getSelectedItem());\r
695                 c.setDVDCompat((String) jCBXPanel_dvdcompat.getSelectedItem());\r
696                 c.setDevice((String) jCBXPanel_device.getSelectedItem());\r
697                 \r
698                 c.setXChapter((String) jCBXPanel_xChapter.getSelectedItem());\r
699                 c.setMsChapter((String) jCBXPanel_msChapter.getSelectedItem());\r
700                 c.setMvChapter((String) jCBXPanel_mvChapter.getSelectedItem());\r
701                 \r
702                 c.setAspect((String) jCBXPanel_aspect.getSelectedItem());\r
703                 c.setBvperf((String) jCBXPanel_bvperf.getSelectedItem());\r
704                 c.setLvoice((String) jCBXPanel_lvoice.getSelectedItem());\r
705                 c.setAutodel((String) jCBXPanel_autodel.getSelectedItem());\r
706                 \r
707                 c.setPursues(ITEM_YES == jCBXPanel_pursues.getSelectedItem());\r
708                 \r
709                 return c;\r
710         }\r
711 \r
712         public AVs getSelectedSetting() {\r
713                 return getSelectedSetting(new AVs());\r
714         }\r
715 \r
716         \r
717         /*******************************************************************************\r
718          * リスナー\r
719          ******************************************************************************/\r
720         \r
721         /***************************************\r
722          * 永続的なリスナー\r
723          **************************************/\r
724         \r
725         private final ItemListener f_il_resetSubgenreItems = new ItemListener() {\r
726                 @Override\r
727                 public void itemStateChanged(ItemEvent e) {\r
728                         // サブジャンルのアイテムをリセットする\r
729                         setSubgenreItems(ProgGenre.get((String) jCBXPanel_genre.getSelectedItem()));\r
730                 }\r
731         };\r
732         \r
733         /**\r
734          * ジャンル別AV設定のロード\r
735          */\r
736         private final ActionListener f_al_loadAction = new ActionListener() {\r
737                 public void actionPerformed(ActionEvent e) {\r
738                         if ( recsetsel != null ) {\r
739                                 setEnabledListenerAll(false);\r
740                                 \r
741                                 recsetsel.doSetAVSettings();\r
742 \r
743                                 setEnabledListenerAll(true);\r
744                         }\r
745                 }\r
746         };\r
747         \r
748         /**\r
749          * ジャンル別AV設定のセーブ\r
750          */\r
751         private final ActionListener f_al_saveAction = new ActionListener() {\r
752                 public void actionPerformed(ActionEvent e) {\r
753                         if ( recsetsel != null ) recsetsel.doSaveAVSettings(false);\r
754                 }\r
755         };\r
756         \r
757         /**\r
758          * 既定AV設定のセーブ\r
759          */\r
760         private final ActionListener f_al_saveDefaultAction = new ActionListener() {\r
761                 public void actionPerformed(ActionEvent e) {\r
762                         if ( recsetsel != null ) recsetsel.doSaveAVSettings(true);\r
763                 }\r
764         };\r
765         \r
766         /**\r
767          * EPG予約以外では番組追従が設定できないようにしたいな\r
768          */\r
769         private final ItemListener f_il_arateChanged = new ItemListener() {\r
770                 @Override\r
771                 public void itemStateChanged(ItemEvent e) {\r
772                         if ( e.getStateChange() != ItemEvent.SELECTED ) {\r
773                                 return;\r
774                         }\r
775 \r
776                         jCBXPanel_msChapter.setLabelForeground(Color.BLACK);\r
777                         jCBXPanel_mvChapter.setLabelForeground(Color.BLACK);\r
778                         jCBXPanel_pursues.setEnabled(true);\r
779                         \r
780                         String pgtype = (String) jCBXPanel_audiorate.getSelectedItem();\r
781                         if ( pgtype == HDDRecorder.ITEM_REC_TYPE_PROG ) {\r
782                                 // "プラグラム予約"なら触る必要なし\r
783                                 jCBXPanel_pursues.setSelectedItem(ITEM_NO);\r
784                                 jCBXPanel_pursues.setEnabled(false);\r
785                         }\r
786                         else {\r
787                                 if ( pgtype == HDDRecorder.ITEM_REC_TYPE_EPG ) {\r
788                                         try {\r
789                                                 if ( Integer.valueOf((String) jCBXPanel_msChapter.getSelectedItem()) <= 0 ) {\r
790                                                         jCBXPanel_msChapter.setLabelForeground(Color.RED);\r
791                                                 }\r
792                                         }\r
793                                         catch (NumberFormatException ev) {\r
794                                                 //\r
795                                         }\r
796                                         try {\r
797                                                 if ( Integer.valueOf((String) jCBXPanel_mvChapter.getSelectedItem()) <= 0 ) {\r
798                                                         jCBXPanel_mvChapter.setLabelForeground(Color.RED);\r
799                                                 }\r
800                                         }\r
801                                         catch (NumberFormatException ev) {\r
802                                                 //\r
803                                         }\r
804                                 }\r
805                         }\r
806                 }\r
807         };\r
808         \r
809 \r
810         /***************************************\r
811          * つけたり外したりするリスナーをつけたり外したりするメソッド\r
812          **************************************/\r
813         \r
814         /**\r
815          * イベントトリガーでアイテムを操作する際に、さらにイベントをキックされてはたまらないのでリスナーを付けたり外したりする\r
816          */\r
817         private void setEnabledListenerAll(boolean enabled) {\r
818 \r
819                 // あとで削除\r
820                 if ( debug ) {\r
821                         if ( enabled ) {\r
822                                 Object o = null;\r
823                                 for ( ItemListener il : jCBXPanel_recorder.getJComboBox().getItemListeners() ) {\r
824                                         if ( il == il_recorderChanged ) {\r
825                                                 System.out.println(DBGID+"****** リスナーの重複登録 ******");\r
826                                                 //CommonUtils.printStackTrace();\r
827                                                 o = il;\r
828                                                 break;\r
829                                         }\r
830                                 }\r
831                                 if ( o == null ) {\r
832                                         System.out.println("+++ リスナーの登録 +++");\r
833                                         //CommonUtils.printStackTrace();\r
834                                 }\r
835                         }\r
836                         else {\r
837                                 System.out.println("... リスナーの削除 ...");\r
838                         }\r
839                 }\r
840                 \r
841                 setEnabledItemListener(jCBXPanel_recorder, il_recorderChanged, enabled);\r
842                 setEnabledItemListener(jCBXPanel_encoder, il_encoderChanged, enabled);\r
843                 setEnabledItemListener(jCBXPanel_videorate, il_vrateChanged, enabled);\r
844                 setEnabledItemListener(jCBXPanel_genre, il_genreChanged, enabled);\r
845         }\r
846         private void setEnabledItemListener(ItemSelectable comp, ItemListener il, boolean b) {\r
847                 comp.removeItemListener(il);\r
848                 if ( b ) {\r
849                         comp.addItemListener(il);\r
850                 }\r
851         }\r
852         \r
853         /***************************************\r
854          * つけたり外したりするリスナー群 \r
855          **************************************/\r
856         \r
857         /**\r
858          *  レコーダーが選択された\r
859          */\r
860         private final ItemListener il_recorderChanged = new ItemListener() {\r
861                 @Override\r
862                 public void itemStateChanged(ItemEvent e) {\r
863                         if ( e.getStateChange() != ItemEvent.SELECTED ) {\r
864                                 return;\r
865                         }\r
866                         \r
867                         if ( recsetsel != null ) {\r
868                                 setEnabledListenerAll(false);   // 停止\r
869                                 \r
870                                 recsetsel.doSelectRecorder((String) jCBXPanel_recorder.getSelectedItem());\r
871                                 \r
872                                 setEnabledListenerAll(true);    // 再開\r
873                         }\r
874                 }\r
875         };\r
876         \r
877         /**\r
878          *  エンコーダが選択された(ので利用可能な画質を選びなおす)\r
879          */\r
880         private final ItemListener il_encoderChanged = new ItemListener() {\r
881                 @Override\r
882                 public void itemStateChanged(ItemEvent e) {\r
883                         if ( e.getStateChange() != ItemEvent.SELECTED ) {\r
884                                 return;\r
885                         }\r
886 \r
887                         if ( recsetsel != null ) {\r
888                                 setEnabledListenerAll(false);   // 停止\r
889                                 \r
890                                 recsetsel.doSelectEncoder((String) jCBXPanel_encoder.getSelectedItem());\r
891                                 \r
892                                 setEnabledListenerAll(true);    // 再開\r
893                         }\r
894                 }\r
895         };\r
896         \r
897 \r
898         /**\r
899          *  画質が選択された(ので利用可能なエンコーダを選びなおす)\r
900          */\r
901         private final ItemListener il_vrateChanged = new ItemListener() {\r
902                 @Override\r
903                 public void itemStateChanged(ItemEvent e) {\r
904                         if ( e.getStateChange() != ItemEvent.SELECTED ) {\r
905                                 return;\r
906                         }\r
907 \r
908                         if ( recsetsel != null ) {\r
909                                 setEnabledListenerAll(false);   // 停止\r
910                                 \r
911                                 recsetsel.doSelectVrate((String) jCBXPanel_videorate.getSelectedItem());\r
912                                 \r
913                                 setEnabledListenerAll(true);    // 再開\r
914                         }\r
915                 }\r
916         };\r
917         \r
918 \r
919         /**\r
920          * ジャンルが選択された\r
921          */\r
922         private final ItemListener il_genreChanged = new ItemListener() {\r
923                 @Override\r
924                 public void itemStateChanged(ItemEvent e) {\r
925                         if (e.getStateChange() != ItemEvent.SELECTED) {\r
926                                 return;\r
927                         }\r
928                         \r
929                         // サブジャンルの選択肢を入れ替える\r
930                         setSubgenreItems(ProgGenre.get((String) jCBXPanel_genre.getSelectedItem()));\r
931                         \r
932                         // AV設定変更してーん\r
933                         if ( recsetsel != null ) recsetsel.doSetAVSettings();\r
934                 }\r
935         };\r
936 \r
937         /*******************************************************************************\r
938          * コンポーネント\r
939          ******************************************************************************/\r
940 \r
941         // あれ?getJXX()が一個もないよ!\r
942         \r
943 }\r