3 import java.awt.BorderLayout;
\r
4 import java.awt.Color;
\r
5 import java.awt.Component;
\r
6 import java.awt.Dimension;
\r
7 import java.awt.event.WindowAdapter;
\r
8 import java.awt.event.WindowEvent;
\r
9 import java.awt.event.WindowListener;
\r
10 import java.util.ArrayList;
\r
11 import java.util.Calendar;
\r
12 import java.util.GregorianCalendar;
\r
14 import javax.swing.JOptionPane;
\r
15 import javax.swing.JPanel;
\r
16 import javax.swing.JScrollPane;
\r
17 import javax.swing.border.LineBorder;
\r
19 import tainavi.TitleEditorPanel.TimeVal;
\r
20 import tainavi.HDDRecorder.RecType;
\r
21 import tainavi.TVProgram.ProgGenre;
\r
22 import tainavi.TVProgram.ProgOption;
\r
23 import tainavi.TVProgram.ProgSubgenre;
\r
26 // ソースがもうグチャグチャでございます.
\r
30 * @since 3.15.4β ReserveDialogからクラス名変更
\r
31 * @version 3.22.2β コンポーネントを、番組情報部・録画設定部、類似予約部の3つに分離(このまま突き進めばロジックとSwingコンポーネントを分離できるんじゃないかしら?)
\r
33 abstract class AbsReserveDialog extends JEscCancelDialog implements HDDRecorderListener,RecordExecutable,RecSettingSelectable,LikeReserveSelectable {
\r
35 private static final long serialVersionUID = 1L;
\r
37 public static String getViewName() { return "予約ダイアログ"; }
\r
39 public void setDebug(boolean b) { debug = b; }
\r
40 private static boolean debug = false;
\r
43 /*******************************************************************************
\r
45 ******************************************************************************/
\r
47 protected abstract Env getEnv();
\r
48 protected abstract TVProgramList getTVProgramList();
\r
49 protected abstract HDDRecorderList getRecorderList();
\r
51 protected abstract AVSetting getAVSetting();
\r
52 protected abstract CHAVSetting getCHAVSetting();
\r
54 protected abstract StatusWindow getStWin();
\r
55 protected abstract StatusTextArea getMWin();
\r
57 protected abstract Component getParentComponent();
\r
59 protected abstract void ringBeep();
\r
61 // クラス内のイベントから呼び出されるもの
\r
62 protected abstract LikeReserveList findLikeReserves(ProgDetailList tvd, String keyword, int threshold);
\r
65 /*******************************************************************************
\r
67 ******************************************************************************/
\r
69 private final Env env = getEnv();
\r
70 private final HDDRecorderList recorders = getRecorderList();
\r
72 private final AVSetting avslist = getAVSetting();
\r
73 private final CHAVSetting chavslist = getCHAVSetting();
\r
75 private final StatusWindow StWin = getStWin(); // これは起動時に作成されたまま変更されないオブジェクト
\r
76 private final StatusTextArea MWin = getMWin(); // これは起動時に作成されたまま変更されないオブジェクト
\r
78 private final Component parent = getParentComponent(); // これは起動時に作成されたまま変更されないオブジェクト
\r
80 private final GetEventId geteventid = new GetEventId(); // 番組IDの取得
\r
83 /*******************************************************************************
\r
85 ******************************************************************************/
\r
89 private static final String MSGID = "["+getViewName()+"] ";
\r
90 private static final String ERRID = "[ERROR]"+MSGID;
\r
91 private static final String DBGID = "[DEBUG]"+MSGID;
\r
94 /*******************************************************************************
\r
96 ******************************************************************************/
\r
100 private JPanel jContentPane_rsv = null;
\r
102 private TitleEditorPanel jPane_title = null; // 番組設定
\r
103 private RecSettingEditorPanel jPane_recsetting = null; // 録画設定
\r
104 private LikeReserveEditorPanel jPane_likersv = null; // 類似予約
\r
105 private OverlapReserveViewPanel jPane_overlap = null;
\r
113 * 初期化漏れが怖いのでまとめて内部クラスとした。
\r
115 private class Vals {
\r
118 LikeReserveList hide_likersvlist = null;
\r
121 String keyword = "";
\r
126 // 実行のON/OFFのみの更新かどうか
\r
127 boolean isUpdateOnlyExec = false;
\r
130 HDDRecorder hide_recorder = null;
\r
131 ProgDetailList hide_tvd = null;
\r
132 AVs hide_avs = null;
\r
134 // 録画設定の選択イベントにより設定される値
\r
135 HDDRecorder selected_recorder = null;
\r
138 private Vals vals = null;
\r
141 * 予約操作が成功したかどうかを返す。
\r
143 public boolean isSucceededReserve() { return doneReserve; }
\r
145 private boolean doneReserve = false;
\r
148 /*******************************************************************************
\r
150 ******************************************************************************/
\r
152 public AbsReserveDialog(int x, int y) {
\r
157 setContentPane(getJContentPane_rsv());
\r
159 // タイトルバーの高さも考慮する必要がある
\r
160 Dimension d = getJContentPane_rsv().getPreferredSize();
\r
165 d.width+(this.getInsets().left+this.getInsets().right),
\r
166 d.height+(this.getInsets().top+this.getInsets().bottom));
\r
167 setResizable(false);
\r
169 setTitle(getViewName());
\r
172 jPane_recsetting.setDebug(env.getDebug());
\r
174 addWindowListener(wl_opened);
\r
178 /*******************************************************************************
\r
180 ******************************************************************************/
\r
182 /***************************************
\r
184 **************************************/
\r
188 * @see #doSelectLikeReserve(int)
\r
190 public boolean open(ProgDetailList tvd) {
\r
191 return open(tvd,null,0);
\r
196 * @see #doSelectLikeReserve(int)
\r
198 public boolean open(ProgDetailList tvd, String keywordVal, int thresholdVal) {
\r
201 doneReserve = false;
\r
203 if (recorders.size() == 0) {
\r
204 return false; // レコーダがひとつもないのはやばい
\r
206 if (tvd.start.equals("")) {
\r
207 return false; // これは「番組情報がありません」だろう
\r
211 if (vals == null) vals = new Vals();
\r
214 String myself = getSelectedMySelf(); // ツールバーで選択されているのはどれかな?
\r
215 HDDRecorder myrec = getSelectedRecorderList().get(0); // 先頭を選んでおけばおけ
\r
217 vals.hide_recorder = myrec; // 隠しパラメータ
\r
218 vals.hide_tvd = tvd; // 隠しパラメータ
\r
220 // ダイアログオープン時に自動で取得する
\r
221 if ( env.getAutoEventIdComplete() ) {
\r
222 tvd.progid = getEventIdOnOpen(tvd);
\r
226 if ( thresholdVal > 0 ) {
\r
227 vals.keyword = keywordVal; // 隠しパラメータ
\r
228 vals.threshold = thresholdVal; // 隠しパラメータ
\r
232 ReserveList myrsv = null;
\r
234 LikeReserveList likersvlist = findLikeReserves(tvd, vals.keyword, vals.threshold); // 類似予約リストの作成
\r
235 if ( env.getGivePriorityToReserved() ) {
\r
237 LikeReserveItem likersv = findClosestLikeReserve(likersvlist, myself); // 類似予約の絞り込み
\r
238 if ( likersv != null ) {
\r
239 myrsvidx = likersvlist.getClosestIndex();
\r
240 myrsv = likersv.getRsv();
\r
241 myrec = likersv.getRec();
\r
245 vals.hide_likersvlist = likersvlist; // 隠しパラメータ
\r
247 // ジャンル別AV設定の確認(該当するものがあれば)
\r
249 if ( myrsv == null ) {
\r
250 // 類似予約がないか、あっても優先されない場合
\r
251 myavs = findAVs(tvd.genre.toString(), tvd.center, myrec.getRecorderId());
\r
254 MWin.appendMessage(MSGID+"画質・音質を類似予約から継承します.");
\r
257 vals.hide_avs = myavs; // 隠しパラメータ
\r
260 setLikeRsvItems(likersvlist);
\r
263 if ( env.getGivePriorityToReserved() && myrsv != null ) {
\r
265 jPane_likersv.setRowSelection(myrsvidx);
\r
269 jPane_likersv.setRowSelection(LikeReserveEditorPanel.LIKERSVTABLE_NONE);
\r
278 public boolean open(ProgDetailList tvd, LikeReserveItem likersv) {
\r
281 doneReserve = false;
\r
283 if (recorders.size() == 0) {
\r
284 return false; // レコーダがひとつもないのはやばい
\r
286 if (tvd.start.equals("")) {
\r
287 return false; // これは「番組情報がありません」だろう
\r
291 if (vals == null) vals = new Vals();
\r
294 HDDRecorder myrec = likersv.getRec();
\r
295 // String myself = myrec.Myself();
\r
297 vals.hide_recorder = myrec; // 隠しパラメータ
\r
298 vals.hide_tvd = tvd; // 隠しパラメータ
\r
300 // ダイアログオープン時に自動で取得する
\r
301 if ( env.getAutoEventIdComplete() ) {
\r
302 tvd.progid = getEventIdOnOpen(tvd);
\r
305 LikeReserveList likersvlist = new LikeReserveList();
\r
306 likersvlist.add(likersv);
\r
308 vals.hide_likersvlist = likersvlist; // 隠しパラメータ
\r
310 MWin.appendMessage(MSGID+"画質・音質を類似予約から継承します.");
\r
313 setLikeRsvItems(likersvlist);
\r
315 // 初期値の選択(類似予約の一個目を選択)
\r
316 jPane_likersv.setRowSelection(LikeReserveEditorPanel.LIKERSVTABLE_DEFAULT);
\r
318 // 番組情報は番組情報から得た情報を優先する ←変な日本語
\r
319 jPane_title.setSelectedValues(tvd);
\r
322 jPane_title.setEnabledRecordButton(false); // 新規ボタンは操作不能に
\r
323 jPane_likersv.setEnabledTable(false); // 類似予約は選択不能に
\r
328 /***************************************
\r
330 **************************************/
\r
333 * 実行のON/OFFだけしか操作しない場合に呼び出す(画面にウィンドウは表示しない)
\r
334 * ※これがあるので、各openでは vals != null チェックの必要がある
\r
336 public boolean open(String myself, String rsvId) {
\r
338 return open(myself, rsvId, null);
\r
343 * 本体予約一覧からのオープン、または予約ON/OFFメニュー
\r
344 * @see #doSelectLikeReserve(int)
\r
346 public boolean open(String myself, String rsvId, Boolean onlyupdateexec) {
\r
349 doneReserve = false;
\r
351 HDDRecorderList myrecs = recorders.findInstance(myself);
\r
352 if ( myrecs.size() == 0 ) {
\r
353 return false; // ここに来たらバグ
\r
355 HDDRecorder myrec = myrecs.get(0);
\r
357 ReserveList myrsv = myrec.getReserveList(rsvId);
\r
358 if ( myrsv == null ) {
\r
359 MWin.appendMessage(ERRID+"更新すべき予約情報が見つかりません: "+myself+", "+rsvId);
\r
361 return false; // ここに来たらバグ
\r
363 if ( myrsv.getCh_name() == null ) {
\r
364 MWin.appendMessage(ERRID+"予約情報の放送局名が不正です: "+myrsv.getStartDateTime()+", "+myrsv.getTitle());
\r
370 if (vals == null) vals = new Vals();
\r
372 // 予約情報から番組情報を組み立てる
\r
373 ProgDetailList tvd = getProgDetails(myrsv);
\r
375 vals.hide_recorder = myrec; // 隠しパラメータ
\r
376 vals.hide_tvd = tvd; // 隠しパラメータ
\r
378 // 予約情報(類似予約の一個目として設定)
\r
379 LikeReserveList likersvlist = new LikeReserveList();
\r
380 likersvlist.add(new LikeReserveItem(myrec, myrsv, 0));
\r
382 vals.hide_likersvlist = likersvlist; // 隠しパラメータ
\r
385 setLikeRsvItems(likersvlist);
\r
387 // 初期値の選択(類似予約の一個目を選択)
\r
388 jPane_likersv.setRowSelection(LikeReserveEditorPanel.LIKERSVTABLE_DEFAULT);
\r
391 jPane_title.setEnabledRecordButton(false); // 新規ボタンは操作不能に
\r
392 jPane_likersv.setEnabledTable(false); // 類似予約は選択不能に
\r
395 * 予約ON・OFFのみの実行かなー?
\r
397 if ( onlyupdateexec != null ) {
\r
398 vals.isUpdateOnlyExec = true;
\r
399 jPane_recsetting.setExecValue(onlyupdateexec);
\r
405 /***************************************
\r
407 **************************************/
\r
412 private LikeReserveItem findClosestLikeReserve(LikeReserveList lrl, String myself) {
\r
414 if ( lrl.size() == 0 ) {
\r
419 LikeReserveItem lr = lrl.getClosest(myself);
\r
420 if ( lr == null ) {
\r
421 // 類似予約があってもコンボボックスで選択したレコーダのものがない
\r
422 if (debug) System.out.println(DBGID+"類似予約に選択中のレコーダのものはなかった: "+myself);
\r
426 // 選択中のレコーダの類似予約があった
\r
433 private AVs findAVs(String key_genre, String key_webChName, String recId) {
\r
435 String selected_key = key_genre;
\r
436 AVSetting xavslist = avslist;
\r
437 if ( env.getEnableCHAVsetting() ) {
\r
438 selected_key = key_webChName;
\r
439 xavslist = chavslist;
\r
442 AVs myavs = xavslist.getSelectedAVs(selected_key, recId);
\r
443 if ( myavs != null ) {
\r
444 if ( myavs.getGenre() != null ) {
\r
445 MWin.appendMessage(MSGID+"画質・音質を自動設定します: "+recId+" & "+myavs.getGenre());
\r
448 MWin.appendMessage(MSGID+"画質・音質にデフォルト設定を適用します: "+recId);
\r
452 MWin.appendMessage(MSGID+"画質・音質の自動設定候補がありません: "+recId+" & "+selected_key);
\r
461 private ReserveList getReserveList(HDDRecorder recorder, ProgDetailList tvd, TimeVal tVal, String enc) {
\r
463 ReserveList r = new ReserveList();
\r
466 if ( tvd != null ) {
\r
467 r.setTitle(tvd.title);
\r
468 r.setCh_name(tvd.center);
\r
469 GregorianCalendar ca = CommonUtils.getCalendar(tVal!=null ? tVal.startDateTime : tvd.startDateTime);
\r
470 GregorianCalendar cz = CommonUtils.getCalendar(tVal!=null ? tVal.endDateTime : tvd.endDateTime);
\r
471 r.setAhh(String.format("%02d",ca.get(Calendar.HOUR_OF_DAY)));
\r
472 r.setAmm(String.format("%02d",ca.get(Calendar.MINUTE)));
\r
473 r.setZhh(String.format("%02d",cz.get(Calendar.HOUR_OF_DAY)));
\r
474 r.setZmm(String.format("%02d",cz.get(Calendar.MINUTE)));
\r
481 r.setRec_mode(getDefaultText(recorder, recorder.getVideoRateList()));
\r
482 r.setRec_audio(getDefaultText(recorder, recorder.getAudioRateList()));
\r
483 r.setRec_folder(getDefaultText(recorder, recorder.getFolderList()));
\r
485 r.setRec_dvdcompat(getDefaultText(recorder, recorder.getDVDCompatList()));
\r
486 r.setRec_device(getDefaultText(recorder, recorder.getDeviceList()));
\r
489 r.setRec_xchapter(getDefaultText(recorder, recorder.getXChapter()));
\r
490 r.setRec_mschapter(getDefaultText(recorder, recorder.getMsChapter()));
\r
491 r.setRec_mvchapter(getDefaultText(recorder, recorder.getMvChapter()));
\r
494 r.setRec_aspect(getDefaultText(recorder, recorder.getAspect()));
\r
495 r.setRec_bvperf(getDefaultText(recorder, recorder.getBVperf()));
\r
496 r.setRec_lvoice(getDefaultText(recorder, recorder.getLVoice()));
\r
497 r.setRec_autodel(getDefaultText(recorder, recorder.getAutodel()));
\r
504 private String getDefaultText(HDDRecorder myrec, ArrayList<TextValueSet> tvs) {
\r
505 TextValueSet t = myrec.getDefaultSet(tvs);
\r
507 return t.getText();
\r
509 if ( tvs.size() > 0 ) {
\r
510 return tvs.get(0).getText();
\r
518 private ProgDetailList getProgDetails(ReserveList myrsv) {
\r
520 ProgDetailList tvd = new ProgDetailList();
\r
522 tvd.title = myrsv.getTitle();
\r
523 tvd.detail = myrsv.getDetail();
\r
525 tvd.center = myrsv.getCh_name();
\r
528 String nextdate = CommonUtils.getNextDate(myrsv);
\r
529 GregorianCalendar ca = CommonUtils.getCalendar(nextdate);
\r
531 ca.add(Calendar.HOUR_OF_DAY, Integer.valueOf(myrsv.getAhh())-ca.get(Calendar.HOUR_OF_DAY));
\r
532 ca.add(Calendar.MINUTE, Integer.valueOf(myrsv.getAmm())-ca.get(Calendar.MINUTE));
\r
533 tvd.startDateTime = CommonUtils.getDateTime(ca);
\r
534 tvd.start = CommonUtils.getTime(ca);
\r
536 ca.add(Calendar.MINUTE, Integer.valueOf(myrsv.getRec_min()));
\r
537 tvd.endDateTime = CommonUtils.getDateTime(ca);
\r
538 tvd.end = CommonUtils.getTime(ca);
\r
541 tvd.progid = myrsv.getContentId();
\r
543 tvd.genre = ProgGenre.get(myrsv.getRec_genre());
\r
544 tvd.subgenre = ProgSubgenre.get(tvd.genre,myrsv.getRec_subgenre());
\r
547 tvd.accurateDate = null;
\r
548 tvd.dontoverlapdown = true;
\r
553 /***************************************
\r
555 **************************************/
\r
557 private TimeVal setTitleItems(HDDRecorder myrec, ProgDetailList tvd, LikeReserveList lrl, boolean atrsvlst) {
\r
559 jPane_title.setContentIdValue(tvd.progid, ! atrsvlst);
\r
560 jPane_title.setTitleItems(tvd, lrl, env.getUseAutocomplete());
\r
561 jPane_title.setChItem(myrec, tvd);
\r
563 TimeVal tVal = getTimeValue(tvd);
\r
564 jPane_title.setTimeValue(tVal);
\r
565 jPane_title.setDateItems(tvd, tVal);
\r
570 /***************************************
\r
572 **************************************/
\r
574 private void setRecSettingItems(HDDRecorderList reclst, HDDRecorder myrec, ProgDetailList tvd) {
\r
576 jPane_recsetting.setLabels(myrec); // 項目ラベル
\r
577 jPane_recsetting.setFixedItems(reclst); // 固定アイテム
\r
578 jPane_recsetting.setFlexItems(myrec,tvd.center); // 可変アイテム
\r
581 /***************************************
\r
583 **************************************/
\r
585 private void setLikeRsvItems(LikeReserveList lrl) {
\r
586 jPane_likersv.setListItems(lrl);
\r
590 /*******************************************************************************
\r
592 ******************************************************************************/
\r
595 * 延長警告などを加味した録画開始・終了日時を算出する
\r
597 private TimeVal getTimeValue(ProgDetailList tvd) {
\r
599 TimeVal tVal = new TimeVal();
\r
601 GregorianCalendar ca = CommonUtils.getCalendar(tvd.startDateTime);
\r
602 GregorianCalendar cz = CommonUtils.getCalendar(tvd.endDateTime);
\r
604 if ( tvd.accurateDate != null ) {
\r
606 if ( env.getOverlapUp() ) {
\r
608 ca.add(Calendar.MINUTE, -1);
\r
610 tVal.margined = true;
\r
614 if ( env.getOverlapDown() ) {
\r
616 cz.add(Calendar.MINUTE, +1);
\r
619 env.getOverlapDown2() &&
\r
620 ! tvd.dontoverlapdown && // NHKは縮めない
\r
621 ! (env.getNoOverlapDown2Sp() && tvd.option.contains(ProgOption.SPECIAL)) // OVAとかは縮めない
\r
624 cz.add(Calendar.MINUTE, -1);
\r
626 tVal.clipped = true;
\r
630 int spoexlen = Integer.valueOf(env.getSpoexLength());
\r
631 if ( tvd.extension == true && spoexlen > 0 ) {
\r
633 cz.add(Calendar.MINUTE, +spoexlen);
\r
636 tVal.spoexlen = spoexlen;
\r
640 tVal.date = CommonUtils.getDate(ca);
\r
642 tVal.ahh = ca.get(Calendar.HOUR_OF_DAY);
\r
643 tVal.amm = ca.get(Calendar.MINUTE);
\r
644 tVal.zhh = cz.get(Calendar.HOUR_OF_DAY);
\r
645 tVal.zmm = cz.get(Calendar.MINUTE);
\r
647 tVal.startDateTime = CommonUtils.getDateTime(ca);
\r
648 tVal.endDateTime = CommonUtils.getDateTime(cz);
\r
654 /*******************************************************************************
\r
656 ******************************************************************************/
\r
659 * ダイアログオープン時の番組ID取得処理
\r
661 private String getEventIdOnOpen(ProgDetailList tvd) {
\r
663 if (debug) System.err.println(DBGID+"ダイアログ表示時の自動番組ID取得 id=\""+tvd.progid+"\"");
\r
665 if ( ContentIdEDCB.isValid(tvd.progid) ) {
\r
666 if (debug) System.err.println(DBGID+"番組ID取得済み");
\r
669 if ( ! env.getAutoEventIdComplete() ) {
\r
670 if (debug) System.err.println(DBGID+"番組ID自動取得OFF");
\r
671 return tvd.progid; // 有効な値かもしれないし、nullかもしれない
\r
674 // キャッシュに情報を持っていないか探す
\r
675 String content_id = getContentId(tvd, false);
\r
676 if ( content_id != null ) {
\r
677 if (debug) System.err.println(DBGID+"番組IDキャッシュ有効");
\r
682 return doGetEventId();
\r
686 /*******************************************************************************
\r
688 ******************************************************************************/
\r
691 * これはグラフで描画するようになるまでの仮置き
\r
692 * @param urabanlist
\r
694 private void showUrabanList(ReserveList myrsv, ArrayList<ReserveList> urabanlist) {
\r
696 jPane_overlap.putOverlap(myrsv, urabanlist);
\r
702 if ( urabanlist == null ) {
\r
705 String MID = MSGID+"[裏番組チェック] ";
\r
706 System.out.println(MID+"----------");
\r
707 if ( urabanlist.size() > 0 ) {
\r
708 for ( ReserveList ura : urabanlist ) {
\r
709 System.out.println(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
713 // 裏番組がない場合に分かりにくかったので追加
\r
714 System.out.println(MID+"裏番組はありません");
\r
719 /*******************************************************************************
\r
721 ******************************************************************************/
\r
726 private final WindowListener wl_opened = new WindowAdapter() {
\r
728 public void windowClosing(WindowEvent e) {
\r
730 if (debug) System.out.println(DBGID+"wl_opened/windowClosing "+((vals!=null)?(vals.toString()):("")));
\r
732 resetWhenWindowClosed();
\r
734 ((AbsReserveDialog) e.getSource()).dispose();
\r
738 public void windowOpened(WindowEvent e) {
\r
739 if (debug) System.out.println(DBGID+"wl_opened/windowOpened");
\r
740 // 開いたときは、タイトル入力エリアにフォーカスを移します
\r
741 // jComboBox_title.requestFocusInWindow();
\r
745 private void resetWhenWindowClosed() {
\r
747 if (debug) System.out.println(DBGID+"resetWhenWindowClosed "+((vals!=null)?(vals.toString()):("")));
\r
749 if (vals == null) return;
\r
756 /*******************************************************************************
\r
758 ******************************************************************************/
\r
760 private JPanel getJContentPane_rsv() {
\r
761 if (jContentPane_rsv == null) {
\r
762 jContentPane_rsv = new JPanel();
\r
764 jContentPane_rsv.setLayout(new BorderLayout());
\r
766 JPanel panel = new JPanel();
\r
767 panel.setLayout(new BorderLayout());
\r
768 jContentPane_rsv.add(panel,BorderLayout.CENTER);
\r
769 jContentPane_rsv.add(getJPane_overlap(),BorderLayout.EAST);
\r
771 panel.add(getJPane_title(),BorderLayout.NORTH);
\r
772 panel.add(getJPane_recsetting(),BorderLayout.CENTER);
\r
773 panel.add(getJPane_likersv(),BorderLayout.SOUTH);
\r
775 return jContentPane_rsv;
\r
781 private JPanel getJPane_title() {
\r
782 if ( jPane_title == null ) {
\r
783 jPane_title = new TitleEditorPanel();
\r
785 jPane_title.setRecordExecuter(this); // 予約実行ボタン押下時のコールバックの設定
\r
787 return jPane_title;
\r
793 private JPanel getJPane_recsetting() {
\r
794 if ( jPane_recsetting == null ) {
\r
795 jPane_recsetting = new RecSettingEditorPanel();
\r
797 jPane_recsetting.setRecSettingSelector(this); // アイテム選択時のコールバックの設定
\r
799 return jPane_recsetting;
\r
805 private JScrollPane getJPane_likersv() {
\r
806 if ( jPane_likersv == null ) {
\r
807 jPane_likersv = new LikeReserveEditorPanel();
\r
809 jPane_likersv.setLikeReserveSelector(this); // 予約実行ボタン押下時のコールバックの設定
\r
811 return jPane_likersv;
\r
817 private JScrollPane getJPane_overlap() {
\r
818 if ( jPane_overlap == null ) {
\r
819 jPane_overlap = new OverlapReserveViewPanel();
\r
820 jPane_overlap.setBorder(new LineBorder(Color.BLACK));
\r
822 return jPane_overlap;
\r
825 /*******************************************************************************
\r
827 ******************************************************************************/
\r
830 * ツールバーでレコーダの選択イベントが発生
\r
833 public void valueChanged(HDDRecorderSelectionEvent e) {
\r
834 if (debug) System.out.println(DBGID+"recorder selection rised");
\r
837 src_recsel = (HDDRecorderSelectable) e.getSource();
\r
841 * ツールバーの操作によって選択されたレコーダのIDを取得する
\r
843 private String getSelectedMySelf() {
\r
844 return ( src_recsel!=null ? src_recsel.getSelectedMySelf() : null );
\r
848 * ツールバーの操作によって選択されたレコーダのプラグインインスタンスリストを取得する
\r
850 private HDDRecorderList getSelectedRecorderList() {
\r
851 return ( src_recsel!=null ? src_recsel.getSelectedList() : null );
\r
854 private HDDRecorderSelectable src_recsel;
\r
858 * ツールバーでレコーダ情報の変更イベントが発生
\r
861 public void stateChanged(HDDRecorderChangeEvent e) {
\r
866 /*******************************************************************************
\r
867 * コールバックメソッドの実装(番組情報)
\r
868 ******************************************************************************/
\r
870 /***************************************
\r
872 **************************************/
\r
878 public void doRecord() {
\r
880 if (debug) System.out.println(DBGID+"doRecord "+vals.toString());
\r
883 final ReserveList newRsv = new ReserveList();
\r
885 jPane_title.getSelectedValues(newRsv); // タイトル
\r
886 jPane_recsetting.getSelectedValues(newRsv); // 録画設定
\r
888 if ( newRsv.getRec_audio() == HDDRecorder.ITEM_REC_TYPE_EPG &&
\r
889 (newRsv.getContentId() == null || newRsv.getContentId().length() == 0) ) {
\r
891 JOptionPane.showConfirmDialog(this, "EPG予約では番組IDが必要になります。", "警告", JOptionPane.CLOSED_OPTION);
\r
895 newRsv.setId(null); // PostRdEntry()中で取得するのでここはダミー
\r
896 newRsv.setUpdateOnlyExec(false); // 新規ONLYなのでfalse固定
\r
898 final HDDRecorder recorder = vals.selected_recorder;
\r
902 new SwingBackgroundWorker(false) {
\r
905 protected Object doWorks() throws Exception {
\r
907 StWin.appendMessage(MSGID+"予約を登録します:"+newRsv.getTitle());
\r
909 if ( recorder.PostRdEntry(newRsv) ) {
\r
911 MWin.appendMessage(MSGID+"正常に登録できました:"+newRsv.getTitle()+"("+newRsv.getCh_name()+")");
\r
912 doneReserve = true;
\r
915 if ( recorder.getUseCalendar() && newRsv.getExec() ) {
\r
917 for ( HDDRecorder calendar : recorders.findInstance(RecType.CALENDAR) ) {
\r
919 StWin.appendMessage(MSGID+"カレンダーに予約情報を登録します");
\r
921 if ( ! calendar.PostRdEntry(newRsv)) {
\r
922 MWin.appendError(ERRID+"[カレンダー] "+calendar.getErrmsg());
\r
929 MWin.appendError(ERRID+"登録に失敗しました:"+newRsv.getTitle()+"("+newRsv.getCh_name()+")");
\r
932 if ( ! recorder.getErrmsg().equals("")) {
\r
933 MWin.appendMessage(MSGID+"[追加情報] "+recorder.getErrmsg());
\r
941 protected void doFinally() {
\r
942 //CommonUtils.milSleep(0);
\r
943 StWin.setVisible(false);
\r
947 CommonSwingUtils.setLocationCenter(parent, (Component)StWin);
\r
948 StWin.setVisible(true);
\r
950 resetWhenWindowClosed();
\r
958 public void doUpdate() {
\r
960 if (debug) System.out.println(DBGID+"doUpdate "+vals.toString());
\r
962 LikeReserveItem likersv = vals.hide_likersvlist.getSelected();
\r
963 if ( likersv == null ) {
\r
964 // ==0なら更新対象の予約情報がないっつーことで処理できない
\r
969 final ReserveList oldRsv = likersv.getRsv();
\r
970 final ReserveList newRsv = oldRsv.clone();
\r
971 final HDDRecorder recorder = likersv.getRec();
\r
973 jPane_title.getSelectedValues(newRsv); // タイトル
\r
974 jPane_recsetting.getSelectedValues(newRsv); // 録画設定
\r
976 if ( (newRsv.getRec_audio() == HDDRecorder.ITEM_REC_TYPE_EPG || newRsv.getRec_audio() == HDDRecorder.ITEM_REC_TYPE_PROG) &&
\r
977 (newRsv.getRec_audio() != oldRsv.getRec_audio()) ) {
\r
979 JOptionPane.showConfirmDialog(this, String.format("%s予約を%s予約には変更できません。",oldRsv.getRec_audio(),newRsv.getRec_audio()), "警告", JOptionPane.CLOSED_OPTION);
\r
983 newRsv.setId(oldRsv.getId()); // 更新では引き継ぐ
\r
984 newRsv.setUpdateOnlyExec(vals.isUpdateOnlyExec); // 実行ON・OFFのみかもしんない
\r
988 new SwingBackgroundWorker(false) {
\r
991 protected Object doWorks() throws Exception {
\r
993 StWin.appendMessage(MSGID+"予約を更新します:"+newRsv.getTitle());
\r
995 if ( recorder.UpdateRdEntry(oldRsv, newRsv) ) {
\r
998 MWin.appendMessage(MSGID+"正常に更新できました:"+oldRsv.getTitle()+"("+oldRsv.getCh_name()+")");
\r
999 doneReserve = true;
\r
1002 if ( recorder.getUseCalendar() ) {
\r
1003 for ( HDDRecorder calendar : recorders.findInstance(RecType.CALENDAR) ) {
\r
1005 StWin.appendMessage(MSGID+"カレンダーの予約情報を更新します");
\r
1007 if ( ! calendar.UpdateRdEntry(oldRsv, (newRsv.getExec())?(newRsv):(null))) {
\r
1008 MWin.appendError(ERRID+"[カレンダー] "+calendar.getErrmsg());
\r
1015 MWin.appendError(ERRID+"更新に失敗しました:"+oldRsv.getTitle()+"("+oldRsv.getCh_name()+")");
\r
1018 if ( ! recorder.getErrmsg().equals("")) {
\r
1019 MWin.appendMessage(MSGID+"[追加情報] "+recorder.getErrmsg());
\r
1026 protected void doFinally() {
\r
1027 StWin.setVisible(false);
\r
1031 StWin.setVisible(true);
\r
1033 resetWhenWindowClosed();
\r
1041 public void doCancel() {
\r
1042 resetWhenWindowClosed();
\r
1046 /***************************************
\r
1047 * 番組ID取得ボタンが押された時の処理
\r
1048 **************************************/
\r
1053 public String doGetEventId() {
\r
1055 final ProgDetailList tvd = vals.hide_tvd;
\r
1059 new SwingBackgroundWorker(false) {
\r
1062 protected Object doWorks() throws Exception {
\r
1063 TatCount tc = new TatCount();
\r
1064 StWin.appendMessage(MSGID+"番組IDを取得します");
\r
1066 String content_id = getContentId(tvd, true);
\r
1067 if ( content_id == null ) {
\r
1068 StWin.appendError(ERRID+String.format("番組IDの取得に失敗しました。所要時間: %.2f秒",tc.end()));
\r
1071 StWin.appendMessage(MSGID+String.format("番組IDを取得しました。所要時間: %.2f秒",tc.end()));
\r
1078 protected void doFinally() {
\r
1079 StWin.setVisible(false);
\r
1083 CommonSwingUtils.setLocationCenter(AbsReserveDialog.this, (Component) StWin);
\r
1084 StWin.setVisible(true);
\r
1086 return tvd.progid;
\r
1089 private String getContentId(ProgDetailList tvd, boolean force) {
\r
1091 String content_id = null;
\r
1093 if ( ContentIdDIMORA.isValid(tvd.progid) ) {
\r
1094 ContentIdDIMORA.decodeContentId(tvd.progid);
\r
1095 String chid = ContentIdDIMORA.getChId();
\r
1096 content_id = getContentIdById(chid, tvd.startDateTime, force);
\r
1099 content_id = getContentIdByName(tvd.center, tvd.startDateTime, force);
\r
1101 if ( content_id != null ) {
\r
1102 tvd.progid = content_id;
\r
1103 tvd.setContentIdStr();
\r
1106 return content_id;
\r
1112 private String getContentIdById(String chid, String startdatetime, boolean force) {
\r
1114 Integer evid = geteventid.getEvId(chid, startdatetime, force);
\r
1116 if ( force && evid == null ) {
\r
1117 MWin.appendError(ERRID+"番組ID取得でエラーが発生しました: "+chid+", "+startdatetime);
\r
1119 return null; // 一発死に
\r
1121 else if ( ! force && evid == null ) {
\r
1122 System.out.println(MSGID+"キャッシュにヒットしませんでした: "+chid+", "+startdatetime);
\r
1125 else if ( evid == -1 ) {
\r
1126 MWin.appendError(ERRID+"番組IDが取得できませんでした: "+chid+", "+startdatetime);
\r
1130 ContentIdDIMORA.decodeChId(chid);
\r
1131 String content_id = ContentIdDIMORA.getContentId(evid);
\r
1133 MWin.appendMessage(MSGID+"番組IDを取得しました(byId): "+content_id);
\r
1135 return content_id;
\r
1139 * レコーダに登録された放送局IDで
\r
1141 private String getContentIdByName(String chname, String startdatetime, boolean force) {
\r
1143 String chid = null;
\r
1144 String chidEDCB = null;
\r
1145 String chidREGZA = null;
\r
1147 Integer evid = null;
\r
1149 // 登録済みのレコーダプラグインを全部チェックしてみる
\r
1150 for ( HDDRecorder rec : recorders ) {
\r
1151 if ( rec.isBackgroundOnly() ) {
\r
1155 chidEDCB = chidREGZA = chid = null;
\r
1156 Integer tmpEvid = null;
\r
1158 String chcode = rec.getChCode().getCH_WEB2CODE(chname);
\r
1159 if ( chcode == null ) {
\r
1160 System.err.println(ERRID+"「Web番組表の放送局名」を「放送局コード」に変換できません: "+rec.getRecorderId()+" "+chname);
\r
1164 chidEDCB = chid = ContentIdEDCB.getChId(chcode);
\r
1165 if ( chid == null ) {
\r
1166 chidREGZA = chid = ContentIdREGZA.getChId(chcode);
\r
1167 if ( chid == null ) {
\r
1168 System.err.println(ERRID+"番組IDの取得に未対応のレコーダです: "+rec.getRecorderId());
\r
1173 if (debug) System.out.println(MSGID+"番組IDを取得します: "+rec.getRecorderId());
\r
1175 tmpEvid = geteventid.getEvId(chid, startdatetime, force);
\r
1177 if (evid == null) evid = tmpEvid;
\r
1179 if ( force && tmpEvid == null ) {
\r
1180 MWin.appendError(ERRID+"番組ID取得でエラーが発生しました: "+chid+", "+startdatetime);
\r
1182 return null; // 一発死に
\r
1184 else if ( ! force && tmpEvid == null ) {
\r
1185 System.out.println(MSGID+"キャッシュにヒットしませんでした: "+chid+", "+startdatetime);
\r
1188 else if ( tmpEvid == -1 ) {
\r
1189 System.err.println(ERRID+"番組IDが取得できませんでした: "+chid+", "+startdatetime);
\r
1196 if ( evid == null ) {
\r
1197 MWin.appendError(ERRID+"【致命的エラー】放送局IDを持つレコーダプラグインが存在しません");
\r
1201 else if ( evid == -1 ) {
\r
1202 MWin.appendError(ERRID+"【警告】番組IDの取得に失敗しました。開始時刻の移動や、まだ番組表サイトに情報が用意されていない場合などが考えられます。");
\r
1207 String content_id;
\r
1208 if ( chidREGZA != null ) {
\r
1209 content_id = ContentIdREGZA.getContentId(chidREGZA, evid);
\r
1212 content_id = ContentIdEDCB.getContentId(chidEDCB, evid);
\r
1215 MWin.appendMessage(MSGID+"番組IDを取得しました(byName): "+content_id);
\r
1217 return content_id;
\r
1220 /*******************************************************************************
\r
1221 * コールバックメソッドの実装(録画設定)
\r
1222 ******************************************************************************/
\r
1224 /***************************************
\r
1226 **************************************/
\r
1229 * レコーダが選択されたのでテキトーな録画設定を選ぶ
\r
1231 public boolean doSelectRecorder(String myself) {
\r
1233 System.out.println(DBGID+"選択されたレコーダ: "+myself);
\r
1235 HDDRecorderList myrecs = recorders.findInstance(myself);
\r
1236 if ( myrecs.size() == 0 ) {
\r
1239 HDDRecorder myrec = myrecs.get(0);
\r
1241 // 今回選択されたレコーダを保存する
\r
1242 vals.selected_recorder = myrec;
\r
1245 ProgDetailList tvd = vals.hide_tvd;
\r
1246 TimeVal tVal = getTimeValue(tvd);
\r
1247 jPane_title.setTimeValue(tVal);
\r
1248 jPane_title.setDateItems(tvd, tVal);
\r
1251 setRecSettingItems(recorders, myrec, tvd);
\r
1254 String enc = myrec.getEmptyEncorder(tvd.center, tVal.startDateTime, tVal.endDateTime, null, null);
\r
1255 ReserveList myrsv = getReserveList(myrec, tvd, tVal, enc);
\r
1256 jPane_recsetting.setSelectedValues(tvd, myrsv);
\r
1258 showUrabanList(myrsv, myrec.getUrabanList());
\r
1264 * エンコーダが選択されたのでテキトーな録画設定を選ぶ(RD用)
\r
1266 public boolean doSelectEncoder(String encoder) {
\r
1268 if ( encoder == null ) {
\r
1272 HDDRecorder myrec = vals.hide_recorder;
\r
1273 if ( myrec == null ) {
\r
1277 // チューナーにあった画質を探そう
\r
1278 String vrate = myrec.getPreferredVrate_VARDIA(encoder);
\r
1279 if ( vrate == null ) {
\r
1284 jPane_recsetting.setSelectedVrateValue(vrate);
\r
1289 * 画質が選択されたのでテキトーな録画設定を選ぶ()
\r
1291 public boolean doSelectVrate(String vrate) {
\r
1293 if ( vrate == null ) {
\r
1297 HDDRecorder myrec = vals.hide_recorder;
\r
1298 if ( myrec == null ) {
\r
1302 // 画質にあったチューナーのリストを探してコンボボックスを並べ替える
\r
1303 ArrayList<TextValueSet> tuners = myrec.getPreferredTuners_VARDIA(vrate);
\r
1304 if ( tuners == null ) {
\r
1308 jPane_recsetting.sortEncoderItems(tuners);
\r
1310 // 画質にあったチューナーを探そう
\r
1311 ReserveList myrsv = jPane_title.getSelectedValues();
\r
1312 String tuner = myrec.getEmptyEncorder(myrsv.getCh_name(), myrsv.getStartDateTime(), myrsv.getEndDateTime(), null, vrate);
\r
1314 jPane_recsetting.setSelectedEncoderValue(tuner);
\r
1318 /***************************************
\r
1320 **************************************/
\r
1325 public boolean doSetAVSettings() {
\r
1327 ReserveList r = jPane_title.getSelectedValues(); // 放送局名の取得
\r
1328 String webChName = r.getCh_name();
\r
1329 if ( webChName == null ) {
\r
1330 System.out.println(ERRID+"放送局名が不正.");
\r
1334 jPane_recsetting.getSelectedValues(r); // ジャンルの取得
\r
1335 ProgGenre genre = ProgGenre.get(r.getRec_genre());
\r
1336 if ( genre == null ) {
\r
1340 HDDRecorder myrec = vals.selected_recorder; // レコーダ情報の取得
\r
1341 if ( myrec == null ) {
\r
1342 System.out.println(ERRID+"レコーダが未選択.");
\r
1345 String recid = myrec.getRecorderId();
\r
1348 AVs myavs = findAVs(genre.toString(), webChName, recid);
\r
1349 if ( myavs == null ) {
\r
1353 // ジャンル別AV設定から追加で選択する
\r
1354 jPane_recsetting.setSelectedValues(myavs);
\r
1362 public boolean doSaveAVSettings(boolean savedefault) {
\r
1364 ReserveList r = jPane_title.getSelectedValues(); // 放送局名の取得
\r
1365 String webChName = r.getCh_name();
\r
1366 if ( webChName == null ) {
\r
1367 System.out.println(ERRID+"放送局名が不正.");
\r
1371 HDDRecorder myrec = vals.selected_recorder; // レコーダ情報の取得
\r
1372 if ( myrec == null ) {
\r
1373 System.out.println(ERRID+"レコーダが未選択.");
\r
1376 String recid = myrec.getRecorderId();
\r
1378 AVs c = jPane_recsetting.getSelectedSetting(); // AV設定の取得
\r
1379 c.setRecorderId(recid);
\r
1381 String key_item = c.getGenre();
\r
1382 AVSetting xavslist = avslist;
\r
1383 if ( env.getEnableCHAVsetting() ) {
\r
1384 key_item = webChName;
\r
1385 xavslist = chavslist; // CHをキーに
\r
1388 if ( savedefault ) {
\r
1389 key_item = null; // デフォルトだよう
\r
1392 c.setGenre(key_item); // 入れなおしだよう
\r
1394 xavslist.add(recid, key_item, c);
\r
1397 MWin.appendMessage(MSGID+"画質・音質等の設定を保存しました:"+recid+" & "+((key_item!=null)?(key_item):("デフォルト")));
\r
1403 /*******************************************************************************
\r
1404 * コールバックメソッドの実装(類似予約)
\r
1405 ******************************************************************************/
\r
1407 /***************************************
\r
1409 **************************************/
\r
1412 * 類似予約が選択されたので処理をしてほしい
\r
1415 public void doSelectLikeReserve(int row) {
\r
1416 if ( row == LikeReserveEditorPanel.LIKERSVTABLE_NONE ) {
\r
1417 doSelectLikeReserveByProg();
\r
1420 doSelectLikeReserveByReserve(row);
\r
1425 private boolean doSelectLikeReserveByProg() {
\r
1427 HDDRecorder myrec = vals.hide_recorder;
\r
1428 ProgDetailList tvd = vals.hide_tvd;
\r
1429 LikeReserveList likersvlist = vals.hide_likersvlist;
\r
1430 AVs myavs = vals.hide_avs;
\r
1431 TimeVal tVal = getTimeValue(tvd);
\r
1434 setTitleItems(myrec, tvd, likersvlist, false);
\r
1435 setRecSettingItems(recorders, myrec, tvd);
\r
1436 jPane_title.setDateItems(tvd, tVal);
\r
1441 jPane_title.setSelectedValues(tvd);
\r
1443 jPane_title.setTimeValue(tVal);
\r
1445 // RDだと画質でエンコーダの種類が絞られちまうンですよ
\r
1446 String vrate = myavs != null ? myavs.getVideorate() : null;
\r
1449 setSelectedRecorder(myrec);
\r
1450 jPane_recsetting.setFlexItems(myrec, tvd.center);
\r
1452 String enc = myrec.getEmptyEncorder(tvd.center, tVal.startDateTime, tVal.endDateTime, null, vrate);
\r
1453 ReserveList myrsv = getReserveList(myrec, tvd, tVal, enc);
\r
1454 jPane_recsetting.setSelectedValues(tvd, myrsv);
\r
1455 showUrabanList(myrsv, myrec.getUrabanList());
\r
1457 if ( myavs != null ) {
\r
1458 // ジャンル別AV設定から追加で選択する
\r
1459 jPane_recsetting.setSelectedValues(myavs);
\r
1464 jPane_title.setEnabledRecordButton(true);
\r
1465 jPane_title.setEnabledUpdateButton(false);
\r
1471 private boolean doSelectLikeReserveByReserve(int row) {
\r
1473 LikeReserveList likersvlist = vals.hide_likersvlist;
\r
1474 LikeReserveItem likersv = likersvlist.setSelectedIndex(row);
\r
1475 ReserveList myrsv = likersv.getRsv();
\r
1477 HDDRecorderList myrecs = new HDDRecorderList();
\r
1478 HDDRecorder myrec = likersv.getRec();
\r
1479 myrecs.add(myrec);
\r
1481 ProgDetailList tvd = vals.hide_tvd;
\r
1482 TimeVal tVal = getTimeValue(tvd);
\r
1485 setTitleItems(myrec, tvd, likersvlist, true);
\r
1486 setRecSettingItems(myrecs, myrec, tvd);
\r
1487 jPane_title.setDateItems(tvd, tVal);
\r
1488 //jPane_recsetting.setFlexItems(myrec, tvd.center);
\r
1493 jPane_title.setSelectedValues(myrsv);
\r
1494 jPane_title.setTimeValue(tVal);
\r
1497 myrec.getEmptyEncorder(tvd.center, myrsv.getStartDateTime(), myrsv.getEndDateTime(), myrsv, null); // 裏番組チェックのみ
\r
1498 setSelectedRecorder(myrec);
\r
1500 ReserveList modrsv = getReserveList(myrec, tvd, tVal, myrsv.getTuner());
\r
1501 showUrabanList(modrsv, myrec.getUrabanList());
\r
1503 jPane_recsetting.setSelectedValues(myrsv);
\r
1507 jPane_title.setEnabledRecordButton(true);
\r
1508 jPane_title.setEnabledUpdateButton(true);
\r
1514 /*******************************************************************************
\r
1516 ******************************************************************************/
\r
1519 * レコーダの選択をしなおしたらコンボボックスアイテムの入れ替えも実行すること
\r
1520 * @see RecSettingEditorPanel#setFlexItems(HDDRecorder, String)
\r
1522 private HDDRecorder setSelectedRecorder(HDDRecorder myrec) {
\r
1523 if ( jPane_recsetting.setSelectedRecorderValue(myrec.Myself()) != null ) {
\r
1524 vals.selected_recorder = myrec;
\r
1531 * <P>指定したレコーダによってフォルダを変える
\r
1532 * <P>うーん、folderを他の用途に転用してるけど問題おきないかな?
\r
1534 private void setSelectedFolder() {
\r
1537 if ( env.getAutoFolderSelect() ) {
\r
1538 String titlePop = TraceProgram.replacePop((String) jComboBox_title.getSelectedItem());
\r
1539 for (int i=0; i<jCBXPanel_folder.getItemCount(); i++) {
\r
1540 String folderPop = TraceProgram.replacePop(((String) jCBXPanel_folder.getItemAt(i)).replaceFirst("^\\[(HDD|USB)\\] ",""));
\r
1541 if (folderPop.equals(titlePop)) {
\r
1542 jCBXPanel_folder.setSelectedIndex(i);
\r
1549 int defaultFolderIdx = -1;
\r
1550 int defaultHDDFolderIdx = -1;
\r
1551 int defaultDVDFolderIdx = -1;
\r
1552 for (int i=0; i<jCBXPanel_folder.getItemCount(); i++ ) {
\r
1553 String folderName = (String) jCBXPanel_folder.getItemAt(i);
\r
1554 if (folderName.indexOf("指定なし") != -1) {
\r
1555 if (defaultFolderIdx == -1) {
\r
1556 defaultFolderIdx = i;
\r
1558 if (folderName.startsWith("[HDD] ")) {
\r
1559 defaultHDDFolderIdx = i;
\r
1561 else if (folderName.startsWith("[USB] ")) {
\r
1562 defaultDVDFolderIdx = i;
\r
1566 if (jCBXPanel_device.getItemCount() > 0) {
\r
1567 if (((String) jCBXPanel_device.getSelectedItem()).equals("HDD")) {
\r
1568 if (defaultHDDFolderIdx != -1) {
\r
1569 jCBXPanel_folder.setSelectedIndex(defaultHDDFolderIdx);
\r
1574 if (defaultDVDFolderIdx != -1) {
\r
1575 jCBXPanel_folder.setSelectedIndex(defaultDVDFolderIdx);
\r
1580 if (defaultFolderIdx != -1) {
\r
1581 jCBXPanel_folder.setSelectedIndex(defaultFolderIdx);
\r