• R/O
  • HTTP
  • SSH
  • HTTPS

提交

Frequently used words (click to add to your profile)

javaandroidc++linuxc#objective-ccocoa誰得qtrubypythongamewindowsbathyscaphephpguic翻訳omegattwitterframeworktestbtronarduinovb.net計画中(planning stage)directxpreviewerゲームエンジンdom

タイニー番組ナビゲータ本体


Commit MetaInfo

修订版f528a735a67e4bf492172cb03ff32ce2df3d8844 (tree)
时间2020-02-08 15:01:39
作者Masahiko Kimura <mkimura@u01....>
CommiterMasahiko Kimura

Log Message

Ver.1.12.11 (2020/2/8)

1.[全体]表示対象タブのカスタマイズ機能
2.[リスト形式][本体予約一覧]フォントを大きくしても固定幅の列の名称が欠けないようにする
3.[リスト形式][新聞形式][本体予約一覧]フルスクリーンにした後詳細情報欄の高さが小さくなる問題の対応
4.[タイトル一覧]「デバイスを選択する」「フォルダを編集する」「番組欄へジャンプする」メニューの追加
5.[設定一覧]ページャーコンボ、レコーダ選択コンボの幅を設定できるようにする
6.[設定一覧]全体に関係する設定項目を先頭に移動する
7.[タイトル情報]「♯」でも話数を切り出せるようにする
8.[DiMORA]高速キャッシュファイルに対応する

更改概述

差异

--- a/TinyBannavi/src/tainavi/AbsChannelDatSettingView.java
+++ b/TinyBannavi/src/tainavi/AbsChannelDatSettingView.java
@@ -45,7 +45,7 @@ public abstract class AbsChannelDatSettingView extends JScrollPane {
4545
4646 private static final long serialVersionUID = 1L;
4747
48- public static String getViewName() { return "CHコード設定"; }
48+ public static String getViewName() { return "CHコード設定"; }
4949
5050 public static void setDebug(boolean b) {debug = b; }
5151 private static boolean debug = false;
@@ -53,35 +53,35 @@ public abstract class AbsChannelDatSettingView extends JScrollPane {
5353 /*******************************************************************************
5454 * 抽象メソッド
5555 ******************************************************************************/
56-
56+
5757 protected abstract Env getEnv();
5858 protected abstract TVProgramList getTVProgramList();
5959 protected abstract ChannelSort getChannelSort();
6060 protected abstract HDDRecorderList getHDDRecorderList();
61-
62- protected abstract StatusWindow getStWin();
61+
62+ protected abstract StatusWindow getStWin();
6363 protected abstract StatusTextArea getMWin();
64-
64+
6565 protected abstract Component getParentComponent();
66-
66+
6767 protected abstract void ringBeep();
68-
69-
68+
69+
7070 /*******************************************************************************
7171 * 呼び出し元から引き継いだもの
7272 ******************************************************************************/
73-
73+
7474 // オブジェクト
7575 //private final Env env = getEnv();
7676 private final TVProgramList tvprograms = getTVProgramList();
7777 private final ChannelSort chsort = getChannelSort();
7878 private final HDDRecorderList recorders = getHDDRecorderList();
79-
79+
8080 private final StatusWindow StWin = getStWin(); // これは起動時に作成されたまま変更されないオブジェクト
8181 private final StatusTextArea MWin = getMWin(); // これは起動時に作成されたまま変更されないオブジェクト
82-
82+
8383 private final Component parent = getParentComponent(); // これは起動時に作成されたまま変更されないオブジェクト
84-
84+
8585 // メソッド
8686 //private void StdAppendMessage(String message) { System.out.println(message); }
8787 //private void StdAppendError(String message) { System.err.println(message); }
@@ -91,7 +91,7 @@ public abstract class AbsChannelDatSettingView extends JScrollPane {
9191 /*******************************************************************************
9292 * 定数
9393 ******************************************************************************/
94-
94+
9595 // レイアウト関連
9696
9797 //private static final int PARTS_WIDTH = 900;
@@ -103,28 +103,28 @@ public abstract class AbsChannelDatSettingView extends JScrollPane {
103103 private static final int LABEL_WIDTH = 200;
104104 private static final int BUTTON_WIDTH = 75;
105105 private static final int BUTTON_WIDTH_LONG = 200;
106-
106+
107107 private static final int TABLE_WIDTH = ChDatColumn.WEBCHNAME.getIniWidth()+ChDatColumn.RECCHNAME.getIniWidth()+ChDatColumn.CHCODE.getIniWidth()+ChDatColumn.BTYPE.getIniWidth()+ChDatColumn.AUTO.getIniWidth()+20;
108-
108+
109109 private static final int UPDATE_WIDTH = 250;
110110 private static final int HINT_WIDTH = 750;
111111
112112 private static final int PANEL_WIDTH = SEP_WIDTH+LABEL_WIDTH+SEP_WIDTH+TABLE_WIDTH+SEP_WIDTH;
113-
113+
114114 // テキスト
115-
115+
116116 private static final String TEXT_HINT =
117117 "「Web番組表の放送局名」と「レコーダの放送局名」を関連付けて予約情報のやりとりができるようにしてください。"+
118118 "詳細はwikiを参照してください(http://sourceforge.jp/projects/tainavi/wiki/FAQ#CHCODE)";
119-
119+
120120 // ログ関連
121-
121+
122122 private static final String MSGID = "["+getViewName()+"] ";
123123 private static final String ERRID = "[ERROR]"+MSGID;
124124 private static final String DBGID = "[DEBUG]"+MSGID;
125-
125+
126126 // カラム設定
127-
127+
128128 private static enum ChDatColumn {
129129 WEBCHNAME ("Web番組表の放送局名", 250),
130130 RECCHNAME ("レコーダの放送局名", 175),
@@ -132,7 +132,7 @@ public abstract class AbsChannelDatSettingView extends JScrollPane {
132132 BTYPE ("放送波の種類", 100),
133133 AUTO ("AUTO", 75),
134134 ;
135-
135+
136136 private String name;
137137 private int iniWidth;
138138
@@ -148,85 +148,85 @@ public abstract class AbsChannelDatSettingView extends JScrollPane {
148148 public int getIniWidth() {
149149 return iniWidth;
150150 }
151-
151+
152152 public int getColumn() {
153153 return ordinal();
154154 }
155155 }
156-
156+
157157 /*******************************************************************************
158158 * 部品
159159 ******************************************************************************/
160-
160+
161161 // コンポーネント
162-
162+
163163 private JPanel jPanel_chDatSetting = null;
164164 private JPanel jPanel_update = null;
165-
165+
166166 private JButton jButton_update = null;
167-
167+
168168 private JLabel jLabel_recorderId = null;
169169 private JComboBox jComboBox_recorderId = null;
170-
170+
171171 private JScrollPane jScrollPane_entries = null;
172172 private ChDatTable jTable_entries = null;
173173 private DefaultCellEditor editorCombo_recchname = null;
174174 private DefaultCellEditor editorField_recchname = null;
175-
175+
176176 private JButton jButton_upCenter = null;
177177 private JButton jButton_downCenter = null;
178-
178+
179179 private JButton jButton_removeCenter = null;
180-
180+
181181 private JButton jButton_addCenter = null;
182182 private JTextFieldWithPopup jTextField_addCenter = null;
183-
183+
184184 private JTextAreaWithPopup jta_help = null;
185185 private JTextAreaWithPopup jta_chdathelp = null;
186-
186+
187187 // コンポーネント以外
188-
188+
189189 private HDDRecorder selectedRecorder = null;
190-
190+
191191 private final RowItemList<ChDatItem> rowData = new RowItemList<ChDatItem>();
192-
192+
193193 /*******************************************************************************
194194 * コンストラクタ
195195 ******************************************************************************/
196-
196+
197197 public AbsChannelDatSettingView() {
198-
198+
199199 super();
200-
200+
201201 this.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
202202 this.getVerticalScrollBar().setUnitIncrement(25);
203203 this.setColumnHeaderView(getJPanel_update());
204204 this.setViewportView(getJPanel_chDatSetting());
205-
205+
206206 }
207-
207+
208208 /*******************************************************************************
209209 * アクション
210210 ******************************************************************************/
211-
211+
212212 /**
213213 * 更新を確定する本体
214214 */
215215 private void updateChDatSetting() {
216-
216+
217217 TatCount tc = new TatCount();
218-
218+
219219 StWin.clear();
220-
220+
221221 new SwingBackgroundWorker(false) {
222-
222+
223223 @Override
224224 protected Object doWorks() throws Exception {
225-
225+
226226 StWin.appendMessage(MSGID+"設定を保存します");
227-
227+
228228 String recId = selectedRecorder.getRecorderId();
229-
229+
230230 //DefaultTableModel model = (DefaultTableModel) jTable_entries.getModel();
231231 ArrayList<String> webChName = new ArrayList<String>();
232232 ArrayList<String> recChName = new ArrayList<String>();
@@ -240,11 +240,11 @@ public abstract class AbsChannelDatSettingView extends JScrollPane {
240240 ringBeep();
241241 return null;
242242 }
243-
243+
244244 webChName.add(c.webChName);
245-
245+
246246 recChName.add(c.recChName);
247-
247+
248248 String chcode = null;
249249 if ( ! selectedRecorder.isRecChNameNeeded() ) {
250250 // NULL
@@ -275,16 +275,16 @@ public abstract class AbsChannelDatSettingView extends JScrollPane {
275275 }
276276 chCode.add(chcode);
277277 }
278-
278+
279279 if (debug) {
280280 for ( int n=0; n<webChName.size(); n++ ) {
281281 System.out.println(String.format(DBGID+"[SAVE] %s,%s,%s",webChName.get(n),recChName.get(n),chCode.get(n)));
282282 }
283283 }
284-
284+
285285 ChannelCode cc = new ChannelCode(recId);
286286 cc.save(webChName, recChName, chCode);
287-
287+
288288 // ここがあるのでSwingBackgroundWorkerを使わざるをえない
289289 for ( HDDRecorder rec : recorders.findPlugin(recId) ) {
290290 // 関連するプラグインを全部リロードする
@@ -293,7 +293,7 @@ public abstract class AbsChannelDatSettingView extends JScrollPane {
293293 }
294294 return null;
295295 }
296-
296+
297297 @Override
298298 protected void doFinally() {
299299 StWinSetVisible(false);
@@ -307,7 +307,7 @@ public abstract class AbsChannelDatSettingView extends JScrollPane {
307307 //MWin.appendError(MSGID+"【重要】 再起動してCHコード設定の変更をレコーダプラグインに反映してください。");
308308 //ringBeep();
309309 }
310-
310+
311311 /**
312312 * <P>RdChannelCode.datをテーブルに展開する(CH設定からも呼ばれる)
313313 * <P>ここで取得した selectedRecorder は各所で使いまわす。レコーダ設定の変更には注意が必要
@@ -315,50 +315,50 @@ public abstract class AbsChannelDatSettingView extends JScrollPane {
315315 public void updateChannelDatTable() {
316316 //
317317 String recId = (String) jComboBox_recorderId.getSelectedItem();
318-
318+
319319 if ( recId == null ) {
320320 MWin.appendError(ERRID+"レコーダが選択できません");
321321 return;
322322 }
323-
323+
324324 ArrayList<HDDRecorder> ra = recorders.findPlugin(recId);
325325 if ( ra.size() == 0 ) {
326326 MWin.appendError(ERRID+"指定のレコーダのプラグインがみつかりません: "+recId);
327327 return;
328328 }
329-
329+
330330 // 選択したレコーダを保存する
331331 selectedRecorder = ra.get(0);
332-
332+
333333 ChannelCode cc = new ChannelCode(recId);
334334 cc.load(false); // ログ出力なし
335335
336336 Boolean availableauto = (selectedRecorder.getChValue().size() != 0) && selectedRecorder.isChCodeNeeded();
337-
337+
338338 jTable_entries.setChValueAvailable(selectedRecorder.isChValueAvailable());
339339 jTable_entries.setChCodeEnabled(selectedRecorder.isChCodeNeeded());
340340 jTable_entries.setBroadcastTypeEnabled(selectedRecorder.isBroadcastTypeNeeded());
341341
342342 rowData.clear();
343-
343+
344344 /*
345345 * 従来のフォーマットとの互換を保つため、いろいろ加工が入る。表示と保存も気を付けなければならない。
346346 */
347-
347+
348348 // 定義にある放送局をリストアップする
349349 for ( String webChName : cc.getChNames() ) {
350350 ChDatItem sa = new ChDatItem();
351351 sa.webChName = webChName;
352352 sa.chCode = cc.getCH_WEB2CODE(webChName);
353353 sa.recChName = cc.getCH_CODE2REC(sa.chCode);
354-
354+
355355 if ( selectedRecorder.isChValueAvailable() ) {
356356 String s = selectedRecorder.value2text(selectedRecorder.getChValue(), sa.chCode);
357357 if ( s != null && s.length() > 0 ) {
358358 sa.recChName = s;
359359 }
360360 }
361-
361+
362362 sa.bType = null;
363363 if ( selectedRecorder.isBroadcastTypeNeeded() ) {
364364 // TvRock対応
@@ -383,10 +383,10 @@ public abstract class AbsChannelDatSettingView extends JScrollPane {
383383
384384 sa.availableAuto = availableauto;
385385 sa.fireChanged();
386-
386+
387387 rowData.add(sa);
388388 }
389-
389+
390390 // 定義にない放送局をリストアップする
391391 {
392392 TVProgramIterator pli = tvprograms.getIterator().build(chsort.getClst(), IterationType.ALL);
@@ -415,7 +415,7 @@ public abstract class AbsChannelDatSettingView extends JScrollPane {
415415 }
416416 }
417417 }
418-
418+
419419 if ( selectedRecorder.isChValueAvailable() ) {
420420 JComboBox combo = ((JComboBox) editorCombo_recchname.getComponent());
421421 combo.removeAllItems();
@@ -429,9 +429,9 @@ public abstract class AbsChannelDatSettingView extends JScrollPane {
429429 //popupを無効にできないかなー
430430 jTable_entries.getColumn(ChDatColumn.RECCHNAME.getName()).setCellEditor(editorField_recchname);
431431 }
432-
432+
433433 ((DefaultTableModel) jTable_entries.getModel()).fireTableDataChanged();
434-
434+
435435 // ヘルプの表示
436436 jta_chdathelp.setText(selectedRecorder.getChDatHelp());
437437 }
@@ -440,33 +440,33 @@ public abstract class AbsChannelDatSettingView extends JScrollPane {
440440 * レコーダコンボボックスを設定しなおす(レコーダ設定タブからも呼ばれる)
441441 */
442442 public void updateRecorderComboBox() {
443-
443+
444444 jComboBox_recorderId.removeItemListener(il_recorderChanged); // 停止
445-
445+
446446 ArrayList<String> ra = new ArrayList<String>();
447447 for ( HDDRecorder r : recorders ) {
448448 if ( r.isBackgroundOnly() ) {
449449 continue;
450450 }
451-
451+
452452 if ( ! ra.contains(r.getRecorderId()) ) {
453453 ra.add(r.getRecorderId());
454454 }
455455 }
456-
456+
457457 // 初期値を設定
458458 jComboBox_recorderId.removeAllItems();;
459459 for ( String s : ra ) {
460460 jComboBox_recorderId.addItem(s);
461461 }
462-
462+
463463 jComboBox_recorderId.addItemListener(il_recorderChanged); // 再開
464464 }
465-
465+
466466 /*******************************************************************************
467467 * リスナー
468468 ******************************************************************************/
469-
469+
470470 /**
471471 * 更新を確定する
472472 */
@@ -476,7 +476,7 @@ public abstract class AbsChannelDatSettingView extends JScrollPane {
476476 updateChDatSetting();
477477 }
478478 };
479-
479+
480480 /**
481481 * レコーダが選択された
482482 */
@@ -489,7 +489,7 @@ public abstract class AbsChannelDatSettingView extends JScrollPane {
489489 }
490490 }
491491 };
492-
492+
493493 private final ActionListener al_removeCenter = new ActionListener() {
494494 @Override
495495 public void actionPerformed(ActionEvent e) {
@@ -504,7 +504,7 @@ public abstract class AbsChannelDatSettingView extends JScrollPane {
504504 ((DefaultTableModel) jTable_entries.getModel()).fireTableDataChanged();
505505 }
506506 };
507-
507+
508508 private final ActionListener al_upCenter = new ActionListener() {
509509 @Override
510510 public void actionPerformed(ActionEvent e) {
@@ -516,7 +516,7 @@ public abstract class AbsChannelDatSettingView extends JScrollPane {
516516 }
517517 }
518518 };
519-
519+
520520 private final ActionListener al_downCenter = new ActionListener() {
521521 @Override
522522 public void actionPerformed(ActionEvent e) {
@@ -540,7 +540,7 @@ public abstract class AbsChannelDatSettingView extends JScrollPane {
540540 if (newCenter.length() == 0) {
541541 return;
542542 }
543-
543+
544544 // 重複チェック
545545 for ( ChDatItem c : rowData ) {
546546 if (c.webChName.equals(newCenter)) {
@@ -548,7 +548,7 @@ public abstract class AbsChannelDatSettingView extends JScrollPane {
548548 return;
549549 }
550550 }
551-
551+
552552 // 表へ追加
553553 Boolean availableauto = false;
554554 for ( HDDRecorder recorder : recorders ) {
@@ -556,7 +556,7 @@ public abstract class AbsChannelDatSettingView extends JScrollPane {
556556 availableauto = (recorder.getChValue().size() != 0) && recorder.isChCodeNeeded();
557557 }
558558 }
559-
559+
560560 ChDatItem sa = new ChDatItem();
561561 sa.webChName = newCenter;
562562 sa.chCode = "";
@@ -565,48 +565,48 @@ public abstract class AbsChannelDatSettingView extends JScrollPane {
565565 sa.availableAuto = availableauto;
566566 sa.fireChanged();
567567 rowData.add(sa);
568-
568+
569569 jTextField_addCenter.setText("");
570-
570+
571571 ((DefaultTableModel) jTable_entries.getModel()).fireTableDataChanged();
572572 }
573573 };
574-
575-
574+
575+
576576 /*******************************************************************************
577577 * コンポーネント
578578 ******************************************************************************/
579-
579+
580580 private JPanel getJPanel_update() {
581581 if (jPanel_update == null)
582582 {
583583 jPanel_update = new JPanel();
584584 jPanel_update.setLayout(new SpringLayout());
585-
585+
586586 jPanel_update.setBorder(new LineBorder(Color.GRAY));
587-
587+
588588 int y = SEP_HEIGHT;
589589 CommonSwingUtils.putComponentOn(jPanel_update, getJButton_update("更新を確定する"), UPDATE_WIDTH, PARTS_HEIGHT, SEP_WIDTH, y);
590-
590+
591591 int yz = SEP_HEIGHT/2;
592592 int x = UPDATE_WIDTH+50;
593593 CommonSwingUtils.putComponentOn(jPanel_update, getJta_help(), HINT_WIDTH, PARTS_HEIGHT+SEP_HEIGHT, x, yz);
594-
594+
595595 y += (PARTS_HEIGHT + SEP_HEIGHT);
596-
596+
597597 // 画面の全体サイズを決める
598598 Dimension d = new Dimension(PANEL_WIDTH,y);
599599 jPanel_update.setPreferredSize(d);
600600 }
601601 return jPanel_update;
602602 }
603-
603+
604604 private JPanel getJPanel_chDatSetting() {
605605 if (jPanel_chDatSetting == null)
606606 {
607607 jPanel_chDatSetting = new JPanel();
608608 jPanel_chDatSetting.setLayout(new SpringLayout());
609-
609+
610610 //
611611 int y = SEP_HEIGHT;
612612 int x = SEP_WIDTH;
@@ -618,7 +618,7 @@ public abstract class AbsChannelDatSettingView extends JScrollPane {
618618 x = SEP_WIDTH+LABEL_WIDTH+SEP_WIDTH;
619619 int table_h = 450;
620620 CommonSwingUtils.putComponentOn(jPanel_chDatSetting, getJScrollPane_entries(), TABLE_WIDTH, table_h, x, y);
621-
621+
622622 if ( jComboBox_recorderId.getItemCount() > 0 ) {
623623 updateChannelDatTable();
624624 }
@@ -629,32 +629,32 @@ public abstract class AbsChannelDatSettingView extends JScrollPane {
629629 CommonSwingUtils.putComponentOn(jPanel_chDatSetting, getJButton_downCenter("下へ"), BUTTON_WIDTH, PARTS_HEIGHT, xz, yz+50);
630630
631631 y+=(table_h-PARTS_HEIGHT);
632- xz = x - (BUTTON_WIDTH_LONG+SEP_WIDTH);
632+ xz = x - (BUTTON_WIDTH_LONG+SEP_WIDTH);
633633 CommonSwingUtils.putComponentOn(jPanel_chDatSetting, getJButton_removeCenter("放送局名を削除する"), BUTTON_WIDTH_LONG, PARTS_HEIGHT, xz, y);
634-
634+
635635 y+=(PARTS_HEIGHT+SEP_HEIGHT);
636636 CommonSwingUtils.putComponentOn(jPanel_chDatSetting, getJButton_addCenter("放送局名を追加する"), BUTTON_WIDTH_LONG, PARTS_HEIGHT, xz, y);
637637 CommonSwingUtils.putComponentOn(jPanel_chDatSetting, getJTextField_addCenter(), ChDatColumn.WEBCHNAME.getIniWidth(), PARTS_HEIGHT, x, y);
638-
638+
639639 y+=(PARTS_HEIGHT+SEP_HEIGHT);
640-
640+
641641 Dimension d = new Dimension(PANEL_WIDTH,y);
642642 jPanel_chDatSetting.setPreferredSize(d);
643643 }
644-
644+
645645 return jPanel_chDatSetting;
646646 }
647-
647+
648648 private JButton getJButton_update(String s)
649649 {
650650 if (jButton_update == null) {
651651 jButton_update = new JButton(s);
652-
652+
653653 jButton_update.addActionListener(al_update);
654654 }
655655 return(jButton_update);
656656 }
657-
657+
658658 // 放送局を上へ・下へ
659659 private JButton getJButton_upCenter(String s) {
660660 if (jButton_upCenter == null) {
@@ -663,7 +663,7 @@ public abstract class AbsChannelDatSettingView extends JScrollPane {
663663 }
664664 return(jButton_upCenter);
665665 }
666-
666+
667667 private JButton getJButton_downCenter(String s) {
668668 if (jButton_downCenter == null) {
669669 jButton_downCenter = new JButton(s);
@@ -671,7 +671,7 @@ public abstract class AbsChannelDatSettingView extends JScrollPane {
671671 }
672672 return(jButton_downCenter);
673673 }
674-
674+
675675 // 削除しちゃうよ
676676 private JButton getJButton_removeCenter(String s) {
677677 if (jButton_removeCenter == null) {
@@ -680,12 +680,12 @@ public abstract class AbsChannelDatSettingView extends JScrollPane {
680680 }
681681 return jButton_removeCenter;
682682 }
683-
683+
684684 // Web番組表に存在しない放送局の強制追加
685685 private JButton getJButton_addCenter(String s) {
686686 if (jButton_addCenter == null) {
687687 jButton_addCenter = new JButton(s);
688-
688+
689689 jButton_addCenter.addMouseListener(ml_addCenter);
690690 }
691691 return(jButton_addCenter);
@@ -696,7 +696,7 @@ public abstract class AbsChannelDatSettingView extends JScrollPane {
696696 }
697697 return jTextField_addCenter;
698698 }
699-
699+
700700 //
701701 private JLabel getJLabel_recorderId(String s) {
702702 if (jLabel_recorderId == null) {
@@ -705,19 +705,19 @@ public abstract class AbsChannelDatSettingView extends JScrollPane {
705705 }
706706 return jLabel_recorderId;
707707 }
708-
708+
709709 private JComboBox getJComboBox_recorderId() {
710710 if (jComboBox_recorderId == null) {
711711 jComboBox_recorderId = new JComboBox();
712712 jComboBox_recorderId.setEditable(false);
713713
714714 updateRecorderComboBox(); // 初期化
715-
715+
716716 jComboBox_recorderId.addItemListener(il_recorderChanged);
717717 }
718718 return jComboBox_recorderId;
719719 }
720-
720+
721721 //
722722 private JScrollPane getJScrollPane_entries() {
723723 if (jScrollPane_entries == null) {
@@ -727,12 +727,12 @@ public abstract class AbsChannelDatSettingView extends JScrollPane {
727727 }
728728 return(jScrollPane_entries);
729729 }
730-
730+
731731 private JTable getJTable_entries() {
732732 if (jTable_entries == null) {
733-
733+
734734 jTable_entries = new ChDatTable(rowData) ;
735-
735+
736736 // テーブルの基本的な設定
737737 ArrayList<String> cola = new ArrayList<String>();
738738 for ( ChDatColumn rc : ChDatColumn.values() ) {
@@ -742,13 +742,13 @@ public abstract class AbsChannelDatSettingView extends JScrollPane {
742742 }
743743 DefaultTableModel model = new DefaultTableModel(cola.toArray(new String[0]), 0);
744744 jTable_entries.setModel(model);
745-
745+
746746 jTable_entries.setAutoResizeMode(JNETable.AUTO_RESIZE_OFF);
747747 jTable_entries.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
748748 jTable_entries.getTableHeader().setReorderingAllowed(false);
749749 jTable_entries.putClientProperty("terminateEditOnFocusLost", true); // これやらないと、編集が確定したように見えて確定しない
750750 //jTable_entries.setRowHeight(jTable_entries.getRowHeight()+4);
751-
751+
752752 // 各カラムの幅
753753 DefaultTableColumnModel columnModel = (DefaultTableColumnModel)jTable_entries.getColumnModel();
754754 TableColumn column = null;
@@ -758,21 +758,21 @@ public abstract class AbsChannelDatSettingView extends JScrollPane {
758758 }
759759 columnModel.getColumn(rc.ordinal()).setPreferredWidth(rc.getIniWidth());;
760760 }
761-
761+
762762 // レコーダの放送局名
763763 editorCombo_recchname = new DefaultCellEditor(new RecorderChannelNameComboBox());
764764 editorCombo_recchname.setClickCountToStart(0);
765765 editorField_recchname = new DefaultCellEditor(new RecoderCnannelNameTextField());
766766 editorField_recchname.setClickCountToStart(1);
767767 jTable_entries.getColumn(ChDatColumn.RECCHNAME.getName()).setCellEditor(editorField_recchname);
768-
768+
769769 // 放送局コード
770770 jTable_entries.getColumn(ChDatColumn.CHCODE.getName()).setCellEditor(new EditorColumn());
771771
772772 // 放送局コードコンボボックス
773773 BroadcastTypeComboBox bTypeBox = new BroadcastTypeComboBox();
774774 jTable_entries.getColumn(ChDatColumn.BTYPE.getName()).setCellEditor(new DefaultCellEditor(bTypeBox));
775-
775+
776776 // 自動設定ボタン
777777 ButtonColumn buttonColumn = new ButtonColumn();
778778 column = jTable_entries.getColumn(ChDatColumn.AUTO.getName());
@@ -782,7 +782,7 @@ public abstract class AbsChannelDatSettingView extends JScrollPane {
782782 }
783783 return jTable_entries;
784784 }
785-
785+
786786 //
787787 private JTextAreaWithPopup getJta_chdathelp() {
788788 jta_chdathelp = CommonSwingUtils.getJta(this,2,0);
@@ -798,9 +798,9 @@ public abstract class AbsChannelDatSettingView extends JScrollPane {
798798 }
799799 return jta_help;
800800 }
801-
802-
803-
801+
802+
803+
804804 /*******************************************************************************
805805 * 独自部品
806806 ******************************************************************************/
@@ -811,7 +811,7 @@ public abstract class AbsChannelDatSettingView extends JScrollPane {
811811 String chCode;
812812 BroadcastType bType;
813813 Boolean availableAuto;
814-
814+
815815 @Override
816816 protected void myrefresh(RowItem o) {
817817 ChDatItem c = (ChDatItem) o;
@@ -821,7 +821,7 @@ public abstract class AbsChannelDatSettingView extends JScrollPane {
821821 c.addData(bType);
822822 c.addData(availableAuto);
823823 }
824-
824+
825825 @Override
826826 public ChDatItem clone() {
827827 return (ChDatItem) super.clone();
@@ -831,19 +831,19 @@ public abstract class AbsChannelDatSettingView extends JScrollPane {
831831 private class ChDatTable extends JTable {
832832
833833 private static final long serialVersionUID = 1L;
834-
834+
835835 private final Color evenColor = new Color(240,240,255);
836836 private final Color oddColor = super.getBackground();
837-
837+
838838 private final Color disabledOddColor = new Color(200,200,200);
839839 private final Color disabledEvenColor = new Color(180,180,180);
840-
840+
841841 private RowItemList<ChDatItem> rowdata = null;
842-
842+
843843 public ChDatTable(RowItemList<ChDatItem> rowdata) {
844844 super();
845845 this.rowdata = rowdata;
846-
846+
847847 // フォントサイズ変更にあわせて行の高さを変える
848848 this.addPropertyChangeListener("font", new RowHeightChangeListener(8));
849849
@@ -856,10 +856,10 @@ public abstract class AbsChannelDatSettingView extends JScrollPane {
856856
857857 public void setChCodeEnabled(boolean b) { chcodeenabled = b; }
858858 private boolean chcodeenabled = true;
859-
859+
860860 public void setBroadcastTypeEnabled(boolean b) { broadcasttypeenabled = b; }
861861 private boolean broadcasttypeenabled = false;
862-
862+
863863 @Override
864864 public boolean isCellEditable(int row, int column) {
865865 if ( column == ChDatColumn.WEBCHNAME.getColumn() ) {
@@ -873,16 +873,16 @@ public abstract class AbsChannelDatSettingView extends JScrollPane {
873873 }
874874 return true;
875875 }
876-
876+
877877 @Override
878878 public Component prepareRenderer(TableCellRenderer tcr, int row, int column) {
879879 Component comp = super.prepareRenderer(tcr, row, column);
880-
880+
881881 Color fg = null;
882882 Color bg = null;
883-
883+
884884 boolean evenline = (row%2 == 1);
885-
885+
886886 if ( column == ChDatColumn.WEBCHNAME.getColumn() ) {
887887 fg = Color.BLUE;
888888 bg = (evenline)?(disabledEvenColor):(disabledOddColor);
@@ -904,16 +904,16 @@ public abstract class AbsChannelDatSettingView extends JScrollPane {
904904 if (fg==null) fg = this.getForeground();
905905 if (bg==null) bg = (evenline)?(evenColor):(oddColor);
906906 }
907-
907+
908908 comp.setForeground(fg);
909909 comp.setBackground(bg);
910-
910+
911911 return comp;
912912 }
913-
913+
914914 @Override
915915 public int getRowCount() { return rowdata.size(); }
916-
916+
917917 @Override
918918 public Object getValueAt(int row, int column) {
919919 ChDatItem c = rowdata.get(row);
@@ -933,7 +933,7 @@ public abstract class AbsChannelDatSettingView extends JScrollPane {
933933 return chcode;
934934 }
935935 else if ( column == ChDatColumn.BTYPE.getColumn() ) {
936-
936+
937937 // 設定値から放送波の種別を判断できるレコーダもある
938938 String selected = selectedRecorder.getRecorderId();
939939 if ( selected != null ) {
@@ -942,12 +942,12 @@ public abstract class AbsChannelDatSettingView extends JScrollPane {
942942 return bt.getName();
943943 }
944944 }
945-
945+
946946 return c.bType.getName();
947947 }
948948 return rowdata.get(row).get(column);
949949 }
950-
950+
951951 @Override
952952 public void setValueAt(Object aValue, int row, int column) {
953953 ChDatItem c = rowdata.get(row);
@@ -990,7 +990,7 @@ public abstract class AbsChannelDatSettingView extends JScrollPane {
990990 return;
991991 }
992992 }
993-
993+
994994 /**
995995 * レコーダの放送局名入力フィールド
996996 */
@@ -1018,16 +1018,16 @@ public abstract class AbsChannelDatSettingView extends JScrollPane {
10181018 if (debug) System.out.println(DBGID+"al_recChNameChanged/ancestorAdded "+e.toString());
10191019 }
10201020 };
1021-
1021+
10221022 public RecoderCnannelNameTextField() {
10231023 super();
10241024 this.setEditable(true);
1025-
1025+
10261026 this.addAncestorListener(al_recChNameChanged);
10271027 }
1028-
1028+
10291029 }
1030-
1030+
10311031 /**
10321032 * レコーダの放送局名選択コンボボックス
10331033 */
@@ -1041,7 +1041,7 @@ public abstract class AbsChannelDatSettingView extends JScrollPane {
10411041 if (debug) System.out.println(DBGID+"il_recChNameChanged "+e.paramString());
10421042 if ( e.getStateChange() == ItemEvent.DESELECTED ) {
10431043 int row = jTable_entries.getSelectedRow();
1044- if ( row >= 0 ) {
1044+ if ( row >= 0 && row < jTable_entries.getRowCount()) {
10451045 // 一行まるごと更新
10461046 jTable_entries.clearSelection();
10471047 jTable_entries.setRowSelectionInterval(row, row);
@@ -1049,7 +1049,7 @@ public abstract class AbsChannelDatSettingView extends JScrollPane {
10491049 }
10501050 }
10511051 };
1052-
1052+
10531053 @Override
10541054 public void setSelectedItem(Object anObject) {
10551055 for ( int i=0; i<getItemCount(); i++ ) {
@@ -1064,16 +1064,16 @@ public abstract class AbsChannelDatSettingView extends JScrollPane {
10641064 }
10651065 super.setSelectedItem(anObject);
10661066 }
1067-
1067+
10681068 public RecorderChannelNameComboBox() {
10691069 super();
10701070 this.setEditable(false);
10711071 this.setMaximumRowCount(15);
1072-
1072+
10731073 this.addItemListener(il_recChNameChanged);
10741074 }
10751075 }
1076-
1076+
10771077 /**
10781078 * 地上波/BS/CS選択コンボボックス
10791079 */
@@ -1095,52 +1095,52 @@ public abstract class AbsChannelDatSettingView extends JScrollPane {
10951095 }
10961096 }
10971097 };
1098-
1098+
10991099 public BroadcastTypeComboBox() {
11001100 super();
11011101 this.setEditable(false);
11021102 for ( BroadcastType b : BroadcastType.values() ) {
11031103 this.addItem(b.getName());
11041104 }
1105-
1105+
11061106 this.addItemListener(il_btypeChanged);
11071107 }
11081108 }
1109-
1110-
1109+
1110+
11111111 /**
11121112 * AUTOボタン
11131113 */
1114- private class ButtonColumn extends AbstractCellEditor implements TableCellRenderer, TableCellEditor {
1114+ private class ButtonColumn extends AbstractCellEditor implements TableCellRenderer, TableCellEditor {
11151115
11161116 private static final long serialVersionUID = 1L;
11171117
11181118 private static final String LABEL = "SET";
1119-
1119+
11201120 private final JButton renderButton;
11211121 private final JButton editorButton;
11221122 private Boolean cellValue = Boolean.FALSE;
1123-
1123+
11241124 public ButtonColumn() {
11251125 super();
11261126 renderButton = new JButton(LABEL);
11271127 editorButton = new JButton(LABEL);
11281128 editorButton.addActionListener(al_set);
11291129 }
1130-
1130+
11311131 private final ActionListener al_set = new ActionListener() {
1132-
1132+
11331133 @Override
11341134 public void actionPerformed(ActionEvent e) {
11351135 fireEditingStopped();
1136-
1136+
11371137 int row = jTable_entries.getSelectedRow();
1138-
1138+
11391139 ChDatItem c = rowData.get(row);
1140-
1140+
11411141 String chCode = c.chCode;
11421142 if ( chCode.length() == 0 ) {
1143-
1143+
11441144 // レコーダプラグインが持っているチャンネルコードバリューを検索する
11451145 if ( selectedRecorder.isChValueAvailable() ) {
11461146 // 新バージョン
@@ -1180,29 +1180,29 @@ public abstract class AbsChannelDatSettingView extends JScrollPane {
11801180 }
11811181 }
11821182 }
1183-
1183+
11841184 c.fireChanged();
11851185 jTable_entries.clearSelection();
11861186 jTable_entries.setRowSelectionInterval(row, row);
11871187 }
11881188 }
11891189 };
1190-
1190+
11911191 public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
11921192 ChDatItem c = rowData.get(row);
11931193 renderButton.setEnabled(c.availableAuto);
11941194 return renderButton;
11951195 }
1196-
1197- public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
1196+
1197+ public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
11981198 ChDatItem c = rowData.get(row);
11991199 editorButton.setEnabled(c.availableAuto);
12001200 cellValue = c.availableAuto;
12011201 return editorButton;
12021202 }
1203-
1203+
12041204 public Object getCellEditorValue() {
1205- return cellValue;
1205+ return cellValue;
12061206 }
12071207 }
12081208 }
--- a/TinyBannavi/src/tainavi/AbsListedView.java
+++ b/TinyBannavi/src/tainavi/AbsListedView.java
@@ -211,6 +211,8 @@ public abstract class AbsListedView extends JPanel implements TickTimerListener
211211
212212 private final int marker_num = 8; // 「予約n」欄に表示するマーカーの数
213213
214+ private int dividerLocationOnShown = 0;
215+
214216 // メソッド
215217 private void StdAppendMessage(String message) { System.out.println(CommonUtils.getNow() + message); }
216218 private void StdAppendError(String message) { System.err.println(CommonUtils.getNow() + message); }
@@ -248,8 +250,8 @@ public abstract class AbsListedView extends JPanel implements TickTimerListener
248250 */
249251 public static enum ListedColumn {
250252 RSVMARK ("予約", 35, false),
251- PICKMARK ("ピック", 35, false),
252- DUPMARK ("重複", 35, false),
253+ PICKMARK ("ピック", 40, false),
254+ DUPMARK ("重複", 40, false),
253255 CHNAME ("チャンネル名", 100, true),
254256 OPTIONS ("オプション", 100, true),
255257 TITLE ("番組タイトル", 300, true),
@@ -262,14 +264,14 @@ public abstract class AbsListedView extends JPanel implements TickTimerListener
262264 STAR ("お気に入り度", 100, true),
263265 SCORE ("スコア", 35, false),
264266 THRESHOLD ("閾値", 35, false),
265- RSVMARK1 ("予約1", 35, false),
266- RSVMARK2 ("予約2", 35, false),
267- RSVMARK3 ("予約3", 35, false),
268- RSVMARK4 ("予約4", 35, false),
269- RSVMARK5 ("予約5", 35, false),
270- RSVMARK6 ("予約6", 35, false),
271- RSVMARK7 ("予約7", 35, false),
272- RSVMARK8 ("予約8", 35, false),
267+ RSVMARK1 ("予約1", 45, false),
268+ RSVMARK2 ("予約2", 45, false),
269+ RSVMARK3 ("予約3", 45, false),
270+ RSVMARK4 ("予約4", 45, false),
271+ RSVMARK5 ("予約5", 45, false),
272+ RSVMARK6 ("予約6", 45, false),
273+ RSVMARK7 ("予約7", 45, false),
274+ RSVMARK8 ("予約8", 45, false),
273275 ;
274276
275277 private String name;
@@ -1547,8 +1549,16 @@ public abstract class AbsListedView extends JPanel implements TickTimerListener
15471549 public void setDetailVisible(boolean aFlag) {
15481550 jTextPane_detail.setVisible(aFlag);
15491551
1550- if (aFlag)
1551- jSplitPane_main.setDividerLocation(bounds.getListedDetailHeight());
1552+ if (aFlag){
1553+ int height = bounds.getListedDetailHeight();
1554+
1555+ if (! isTabSelected(MWinTab.LISTED))
1556+ dividerLocationOnShown = height;
1557+ else
1558+ jSplitPane_main.setDividerLocation(height);
1559+
1560+ bounds.setListedDetailHeight(height);
1561+ }
15521562 }
15531563
15541564 /**
@@ -1745,6 +1755,11 @@ public abstract class AbsListedView extends JPanel implements TickTimerListener
17451755
17461756 // 他のコンポーネントと連動
17471757 onShown();
1758+
1759+ if (dividerLocationOnShown != 0){
1760+ jSplitPane_main.setDividerLocation(dividerLocationOnShown);
1761+ dividerLocationOnShown = 0;
1762+ }
17481763 }
17491764 }
17501765 @Override
@@ -2620,7 +2635,10 @@ public abstract class AbsListedView extends JPanel implements TickTimerListener
26202635 if (b) {
26212636 column.setMinWidth(MIN_COLUMN_WIDTH);
26222637 Integer w = bounds.getListedColumnSize().get(lc.toString());
2623- column.setPreferredWidth(w != null ? w : lc.getIniWidth());
2638+ if (lc.isResizable())
2639+ column.setPreferredWidth(w != null ? w : lc.getIniWidth());
2640+ else
2641+ column.setPreferredWidth(env.ZMSIZE(lc.getIniWidth()));
26242642 }
26252643 else {
26262644 column.setMinWidth(0);
@@ -4384,7 +4402,10 @@ public abstract class AbsListedView extends JPanel implements TickTimerListener
43844402 col.setResizable(lc.isResizable());
43854403 col.setMinWidth(MIN_COLUMN_WIDTH);
43864404 Integer w = bounds.getListedColumnSize().get(lc.toString());
4387- col.setPreferredWidth(w != null ? w : lc.getIniWidth());
4405+ if (lc.isResizable())
4406+ col.setPreferredWidth(w != null ? w : lc.getIniWidth());
4407+ else
4408+ col.setPreferredWidth(env.ZMSIZE(lc.getIniWidth()));
43884409 }
43894410 }
43904411
--- a/TinyBannavi/src/tainavi/AbsPaperColorsDialog.java
+++ b/TinyBannavi/src/tainavi/AbsPaperColorsDialog.java
@@ -436,9 +436,9 @@ abstract class AbsPaperColorsDialog extends JEscCancelDialog {
436436
437437 CommonSwingUtils.putComponentOn(jPanel_pColors, new JTitleLabel("ジャンル別背景色"), TITLE_WIDTH, PARTS_HEIGHT, SEP_WIDTH_NARROW, y);
438438 y += (PARTS_HEIGHT+SEP_HEIGHT_NARROW);
439- CommonSwingUtils.putComponentOn(jPanel_pColors, getJScrollPane_list(), TABLE_WIDTH, TABLE_HEIGHT, SEP_WIDTH, y);
439+ CommonSwingUtils.putComponentOn(jPanel_pColors, getJScrollPane_list(), TABLE_WIDTH, ZMSIZE(TABLE_HEIGHT), SEP_WIDTH, y);
440440
441- y += (TABLE_HEIGHT+SEP_HEIGHT);
441+ y += ZMSIZE(TABLE_HEIGHT)+SEP_HEIGHT;
442442 CommonSwingUtils.putComponentOn(jPanel_pColors, new JTitleLabel("タイムバーの色"), TITLE_WIDTH, PARTS_HEIGHT, SEP_WIDTH_NARROW, y);
443443 y += (PARTS_HEIGHT+SEP_HEIGHT_NARROW);
444444 CommonSwingUtils.putComponentOn(jPanel_pColors, jLabel_timebar = new JCCLabel("6~11", origenv.getTimebarColor(),true,this,ccwin), TIMEBAR_WIDTH, PARTS_HEIGHT, x, y);
@@ -514,6 +514,7 @@ abstract class AbsPaperColorsDialog extends JEscCancelDialog {
514514 //
515515 jTableModel_list = new DefaultTableModel(colname, 0);
516516 jTable_list = new JNETable(jTableModel_list, false);
517+ jTable_list.setRowHeight(ZMSIZE(jTable_list.getRowHeight()));
517518 jTable_list.setAutoResizeMode(JNETable.AUTO_RESIZE_OFF);
518519 DefaultTableColumnModel columnModel = (DefaultTableColumnModel)jTable_list.getColumnModel();
519520 TableColumn column = null;
@@ -604,9 +605,9 @@ abstract class AbsPaperColorsDialog extends JEscCancelDialog {
604605
605606 y += (PARTS_HEIGHT+SEP_HEIGHT_NARROW);
606607 CommonSwingUtils.putComponentOn(jPanel_fonts, new JLabel("スタイル"), LABEL_WIDTH, PARTS_HEIGHT, SEP_WIDTH, y);
607- CommonSwingUtils.putComponentOn(jPanel_fonts, jScrollPane_titleFontStyle = getJScrollPane_fontstyle(), ITEM_WIDTH, STYLETABLE_HEIGHT, SEP_WIDTH+LABEL_WIDTH, y);
608+ CommonSwingUtils.putComponentOn(jPanel_fonts, jScrollPane_titleFontStyle = getJScrollPane_fontstyle(), ITEM_WIDTH, ZMSIZE(STYLETABLE_HEIGHT), SEP_WIDTH+LABEL_WIDTH, y);
608609
609- y += (STYLETABLE_HEIGHT+10);
610+ y += ZMSIZE(STYLETABLE_HEIGHT)+10;
610611 CommonSwingUtils.putComponentOn(jPanel_fonts, new JTitleLabel("番組詳細のフォント設定"), TITLE_WIDTH, PARTS_HEIGHT, SEP_WIDTH_NARROW, y);
611612
612613 y += (PARTS_HEIGHT+SEP_HEIGHT_NARROW);
@@ -624,9 +625,9 @@ abstract class AbsPaperColorsDialog extends JEscCancelDialog {
624625
625626 y += (PARTS_HEIGHT+SEP_HEIGHT_NARROW);
626627 CommonSwingUtils.putComponentOn(jPanel_fonts, new JLabel("スタイル"), LABEL_WIDTH, PARTS_HEIGHT, SEP_WIDTH, y);
627- CommonSwingUtils.putComponentOn(jPanel_fonts, jScrollPane_detailFontStyle = getJScrollPane_fontstyle(), ITEM_WIDTH, STYLETABLE_HEIGHT, SEP_WIDTH+LABEL_WIDTH, y);
628+ CommonSwingUtils.putComponentOn(jPanel_fonts, jScrollPane_detailFontStyle = getJScrollPane_fontstyle(), ITEM_WIDTH, ZMSIZE(STYLETABLE_HEIGHT), SEP_WIDTH+LABEL_WIDTH, y);
628629
629- y += (STYLETABLE_HEIGHT+SEP_HEIGHT_NARROW);
630+ y += ZMSIZE(STYLETABLE_HEIGHT)+SEP_HEIGHT_NARROW;
630631 CommonSwingUtils.putComponentOn(jPanel_fonts, jSP_detailTab = new JSliderPanel("左余白",LABEL_WIDTH,0,24,ITEM_WIDTH), LABEL_WIDTH+ITEM_WIDTH, PARTS_HEIGHT, SEP_WIDTH, y);
631632
632633 y += (PARTS_HEIGHT+SEP_HEIGHT*3);
@@ -700,6 +701,7 @@ abstract class AbsPaperColorsDialog extends JEscCancelDialog {
700701 return (column == 0);
701702 }
702703 };
704+ jTable.setRowHeight(ZMSIZE(jTable.getRowHeight()));
703705 jTable.setAutoResizeMode(JNETable.AUTO_RESIZE_OFF);
704706 DefaultTableColumnModel columnModel = (DefaultTableColumnModel)jTable.getColumnModel();
705707 TableColumn column = null;
@@ -855,6 +857,11 @@ abstract class AbsPaperColorsDialog extends JEscCancelDialog {
855857 */
856858 }
857859
860+ /*
861+ * フォントサイズを考慮した長さを取得する
862+ */
863+ private int ZMSIZE(int size){ return origenv.ZMSIZE(size); }
864+
858865 /*******************************************************************************
859866 * 独自部品
860867 ******************************************************************************/
--- a/TinyBannavi/src/tainavi/AbsPaperView.java
+++ b/TinyBannavi/src/tainavi/AbsPaperView.java
@@ -280,6 +280,8 @@ public abstract class AbsPaperView extends JPanel implements TickTimerListener,H
280280 private boolean byCenterMode = false; // 1放送局の1週間分を表示するモード化か
281281 private String startDate = CommonUtils.getDate529(0, true); // 放送局別の場合の開始日
282282
283+ private int dividerLocationOnShown = 0;
284+
283285 /*
284286 * ページャーのEnable/Disableを更新する
285287 */
@@ -610,11 +612,12 @@ public abstract class AbsPaperView extends JPanel implements TickTimerListener,H
610612 */
611613 public void redrawByPager() {
612614 Point vp = vport.getViewPosition();
613- Dimension vs = vport.getSize();
615+// Dimension vs = vport.getSize();
614616
615617 redrawByCurrentSelection();
616618
617- jLayeredPane_space_main_view.scrollRectToVisible(new Rectangle(vp, vs));
619+// jLayeredPane_space_main_view.scrollRectToVisible(new Rectangle(vp, vs));
620+ vport.setViewPosition(vp);
618621 }
619622
620623 /*
@@ -1080,8 +1083,16 @@ public abstract class AbsPaperView extends JPanel implements TickTimerListener,H
10801083 public void setDetailVisible(boolean aFlag) {
10811084 jTextPane_detail.setVisible(aFlag);
10821085
1083- if (aFlag)
1084- jSplitPane_main.setDividerLocation(bounds.getPaperDetailHeight());
1086+ if (aFlag){
1087+ int height = bounds.getPaperDetailHeight();
1088+
1089+ if (! isTabSelected(MWinTab.PAPER))
1090+ dividerLocationOnShown = height;
1091+ else
1092+ jSplitPane_main.setDividerLocation(height);
1093+
1094+ bounds.setPaperDetailHeight(height);
1095+ }
10851096 }
10861097
10871098 /**
@@ -2643,6 +2654,11 @@ public abstract class AbsPaperView extends JPanel implements TickTimerListener,H
26432654 // 他のコンポーネントと連動
26442655 onShown();
26452656
2657+ if (dividerLocationOnShown != 0){
2658+ jSplitPane_main.setDividerLocation(dividerLocationOnShown);
2659+ dividerLocationOnShown = 0;
2660+ }
2661+
26462662 updatePagerEnabled();
26472663 }
26482664
--- a/TinyBannavi/src/tainavi/AbsReserveListView.java
+++ b/TinyBannavi/src/tainavi/AbsReserveListView.java
@@ -45,6 +45,8 @@ import javax.swing.table.TableColumn;
4545 import javax.swing.table.TableModel;
4646 import javax.swing.table.TableRowSorter;
4747
48+import tainavi.VWMainWindow.MWinTab;
49+
4850
4951 /**
5052 * 本体予約一覧タブのクラス
@@ -109,6 +111,7 @@ public abstract class AbsReserveListView extends JPanel implements TickTimerList
109111 */
110112 protected abstract String getSelectedRecorderOnToolbar();
111113
114+ protected abstract boolean isTabSelected(MWinTab tab);
112115
113116 /*******************************************************************************
114117 * 定数
@@ -166,6 +169,8 @@ public abstract class AbsReserveListView extends JPanel implements TickTimerList
166169
167170 private ReserveListColumnInfoList rlitems = null;
168171
172+ private int dividerLocationOnShown = 0;
173+
169174 /**
170175 * カラム定義
171176 */
@@ -764,8 +769,16 @@ public abstract class AbsReserveListView extends JPanel implements TickTimerList
764769 public void setDetailVisible(boolean aFlag) {
765770 jTextPane_detail.setVisible(aFlag);
766771
767- if (aFlag)
768- jSplitPane_main.setDividerLocation(bounds.getReserveDetailHeight());
772+ if (aFlag){
773+ int height = bounds.getReserveDetailHeight();
774+
775+ if (! isTabSelected(MWinTab.RSVED))
776+ dividerLocationOnShown = height;
777+ else
778+ jSplitPane_main.setDividerLocation(height);
779+
780+ bounds.setReserveDetailHeight(height);
781+ }
769782 }
770783
771784 /**
@@ -1055,6 +1068,11 @@ public abstract class AbsReserveListView extends JPanel implements TickTimerList
10551068 recorder.removePassedReserves();
10561069 }
10571070
1071+ if (dividerLocationOnShown != 0){
1072+ jSplitPane_main.setDividerLocation(dividerLocationOnShown);
1073+ dividerLocationOnShown = 0;
1074+ }
1075+
10581076 // 予約一覧を再構築する
10591077 _redrawReservedList();
10601078 }
@@ -1703,9 +1721,11 @@ public abstract class AbsReserveListView extends JPanel implements TickTimerList
17031721 if (col == null)
17041722 continue;
17051723
1706- Integer width = bounds.getRsvedColumnSize().get(rc.toString());
1707- if (width != null)
1708- col.setPreferredWidth(width);
1724+ Integer w = bounds.getRsvedColumnSize().get(rc.toString());
1725+ if (rc == RsvedColumn.EXEC)
1726+ col.setPreferredWidth(env.ZMSIZE(rc.getIniWidth()));
1727+ else
1728+ col.setPreferredWidth(w != null ? w : rc.getIniWidth());
17091729 }
17101730 }
17111731
--- a/TinyBannavi/src/tainavi/AbsSettingView.java
+++ b/TinyBannavi/src/tainavi/AbsSettingView.java
@@ -73,6 +73,7 @@ public abstract class AbsSettingView extends JScrollPane {
7373 protected abstract TitleListColumnInfoList getTlItemEnv();
7474 protected abstract ListedNodeInfoList getLnItemEnv();
7575 protected abstract ToolBarIconInfoList getTbIconEnv();
76+ protected abstract TabInfoList getTabItemEnv();
7677
7778 protected abstract VWLookAndFeel getLAFEnv();
7879 protected abstract VWFont getFontEnv();
@@ -100,6 +101,7 @@ public abstract class AbsSettingView extends JScrollPane {
100101 private final TitleListColumnInfoList tlitems = getTlItemEnv();
101102 private final ListedNodeInfoList lnitems = getLnItemEnv();
102103 private final ToolBarIconInfoList tbicons = getTbIconEnv();
104+ private final TabInfoList tabitems = getTabItemEnv();
103105
104106 private final StatusWindow StWin = getStWin(); // これは起動時に作成されたまま変更されないオブジェクト
105107 private final StatusTextArea MWin = getMWin(); // これは起動時に作成されたまま変更されないオブジェクト
@@ -165,6 +167,25 @@ public abstract class AbsSettingView extends JScrollPane {
165167 private JPanel jPanel_update = null;
166168 private JButton jButton_update = null;
167169
170+ // 全体
171+ private JLabel jLabel_toolbar = null;
172+ private JScrollPane jScrollPane_toolbar = null;
173+ private JNETable jTable_toolbar = null;
174+ private JButton jButton_toolbar_up = null;
175+ private JButton jButton_toolbar_down = null;
176+ private JButton jButton_toolbar_default = null;
177+
178+ private JLabel jLabel_tabs = null;
179+ private JScrollPane jScrollPane_tabs = null;
180+ private JNETable jTable_tabs = null;
181+
182+ private JSliderPanel jSP_keywordWidth = null;
183+ private JSliderPanel jSP_pagerComboWidth = null;
184+ private JSliderPanel jSP_recorderComboWidth = null;
185+ private JSliderPanel jSP_detailRows = null;
186+ private JSliderPanel jSP_statusRows = null;
187+
188+
168189 // リスト形式
169190 private JCheckBoxPanel jCBP_disableFazzySearch = null;
170191 private JCheckBoxPanel jCBP_disableFazzySearchReverse = null;
@@ -326,17 +347,6 @@ public abstract class AbsSettingView extends JScrollPane {
326347 private JCheckBoxPanel jCBP_showTitleDetail = null;
327348
328349 // その他
329- private JLabel jLabel_toolbar = null;
330- private JScrollPane jScrollPane_toolbar = null;
331- private JNETable jTable_toolbar = null;
332- private JButton jButton_toolbar_up = null;
333- private JButton jButton_toolbar_down = null;
334- private JButton jButton_toolbar_default = null;
335-
336- private JSliderPanel jSP_keywordWidth = null;
337- private JSliderPanel jSP_detailRows = null;
338- private JSliderPanel jSP_statusRows = null;
339-
340350 private JComboBoxPanel jCBX_updateMethod = null;
341351 private JCheckBoxPanel jCBP_disableBeep = null;
342352 private JCheckBoxPanel jCBP_showSysTray = null;
@@ -361,6 +371,9 @@ public abstract class AbsSettingView extends JScrollPane {
361371 */
362372 private boolean reload_prog_needed = false;
363373
374+ // タブが表示固定かどうかの配列
375+ boolean tab_selected [] = {true, true, false, false, false, false, true};
376+
364377 /*******************************************************************************
365378 * コンストラクタ
366379 ******************************************************************************/
@@ -415,6 +428,54 @@ public abstract class AbsSettingView extends JScrollPane {
415428 */
416429
417430 /*
431+ * 全体
432+ */
433+ private int createBlock0(int y){
434+ CommonSwingUtils.putComponentOn(jPanel_setting, new JLabel("<<<全体>>>"), LABEL_WIDTH, PARTS_HEIGHT, SEP_WIDTH, y);
435+ y+=(PARTS_HEIGHT+SEP_HEIGHT);
436+
437+ int tabs_h = PARTS_HEIGHT*8;
438+ int tabs_w = 320;
439+ CommonSwingUtils.putComponentOn(jPanel_setting, getJLabel_tabs("表示対象タブの選択"), LABEL_WIDTH, PARTS_HEIGHT, SEP_WIDTH, y);
440+ CommonSwingUtils.putComponentOn(jPanel_setting, getJScrollPane_tabs(), tabs_w, tabs_h, LABEL_WIDTH+SEP_WIDTH, y);
441+ // ★★★ RELOADリスナーは getJScrollPane_tabs()内でつける
442+ y+=(tabs_h+SEP_HEIGHT);
443+
444+ int tbicons_w = 320;
445+ int tbicons_h = PARTS_HEIGHT*8;
446+ CommonSwingUtils.putComponentOn(jPanel_setting, getJLabel_toolbar("ツールバー表示対象項目の選択"), LABEL_WIDTH, PARTS_HEIGHT, SEP_WIDTH, y);
447+ CommonSwingUtils.putComponentOn(jPanel_setting, getJButton_toolbar_up("↑"), 50, PARTS_HEIGHT, LABEL_WIDTH+SEP_WIDTH+10+tbicons_w, y);
448+ CommonSwingUtils.putComponentOn(jPanel_setting, getJButton_toolbar_down("↓"), 50, PARTS_HEIGHT, LABEL_WIDTH+SEP_WIDTH+10+tbicons_w, y+PARTS_HEIGHT+SEP_WIDTH);
449+ CommonSwingUtils.putComponentOn(jPanel_setting, getJScrollPane_toolbar(), tbicons_w, tbicons_h, LABEL_WIDTH+SEP_WIDTH, y);
450+ CommonSwingUtils.putComponentOn(jPanel_setting, getJButton_toolbar_default("初期値"), 75, PARTS_HEIGHT, LABEL_WIDTH+SEP_WIDTH+10+tbicons_w, y+tbicons_h-PARTS_HEIGHT);
451+ y+=(tbicons_h+SEP_HEIGHT);
452+
453+ CommonSwingUtils.putComponentOn(jPanel_setting, jSP_keywordWidth = new JSliderPanel("┗ 検索ボックスの横幅",LABEL_WIDTH,0,600,200), PARTS_WIDTH, PARTS_HEIGHT, SEP_WIDTH, y);
454+ jSP_keywordWidth.setValue(bounds.getSearchBoxAreaWidth());
455+ // RELOADリスナー不要
456+ y+=(PARTS_HEIGHT+SEP_HEIGHT);
457+
458+ CommonSwingUtils.putComponentOn(jPanel_setting, jSP_pagerComboWidth = new JSliderPanel("┗ ページャーコンボボックスの横幅",LABEL_WIDTH,0,600,200), PARTS_WIDTH, PARTS_HEIGHT, SEP_WIDTH, y);
459+ jSP_pagerComboWidth.setValue(bounds.getPagerComboWidth());
460+ // RELOADリスナー不要
461+ y+=(PARTS_HEIGHT+SEP_HEIGHT);
462+
463+ CommonSwingUtils.putComponentOn(jPanel_setting, jSP_recorderComboWidth = new JSliderPanel("┗ レコーダ選択コンボボックスの横幅",LABEL_WIDTH,0,600,200), PARTS_WIDTH, PARTS_HEIGHT, SEP_WIDTH, y);
464+ jSP_recorderComboWidth.setValue(bounds.getRecorderComboWidth());
465+ // RELOADリスナー不要
466+ y+=(PARTS_HEIGHT+SEP_HEIGHT);
467+
468+ CommonSwingUtils.putComponentOn(jPanel_setting, jSP_detailRows = new JSliderPanel("詳細情報欄の行数(0:前回終了時の高さ)",LABEL_WIDTH,0,10,200), PARTS_WIDTH, PARTS_HEIGHT, SEP_WIDTH, y);
469+ jSP_detailRows.setValue(bounds.getDetailRows());
470+ y+=(PARTS_HEIGHT+SEP_HEIGHT);
471+
472+ CommonSwingUtils.putComponentOn(jPanel_setting, jSP_statusRows = new JSliderPanel("ステータス欄の行数(0:前回終了時の高さ)",LABEL_WIDTH,0,10,200), PARTS_WIDTH, PARTS_HEIGHT, SEP_WIDTH, y);
473+ jSP_statusRows.setValue(bounds.getStatusRows());
474+ y+=(PARTS_HEIGHT+SEP_HEIGHT);
475+
476+ return y;
477+ }
478+ /*
418479 * リスト形式
419480 */
420481 private int createBlock1(int y){
@@ -670,7 +731,7 @@ public abstract class AbsSettingView extends JScrollPane {
670731 // RELOADリスナー不要
671732 y+=(PARTS_HEIGHT+SEP_HEIGHT);
672733
673- CommonSwingUtils.putComponentOn(jPanel_setting, jSP_passedLogLimit = new JSliderPanel("過去ログの日付ノードの表示数",LABEL_WIDTH,7,180,200), PARTS_WIDTH, PARTS_HEIGHT, SEP_WIDTH, y);
734+ CommonSwingUtils.putComponentOn(jPanel_setting, jSP_passedLogLimit = new JSliderPanel("過去ログの日付ノードの表示数",LABEL_WIDTH,7,365*2,200), PARTS_WIDTH, PARTS_HEIGHT, SEP_WIDTH, y);
674735 jSP_passedLogLimit.setValue(env.getPassedLogLimit());
675736 // RELOADリスナー不要
676737 y+=(PARTS_HEIGHT+SEP_HEIGHT);
@@ -1150,28 +1211,6 @@ public abstract class AbsSettingView extends JScrollPane {
11501211 CommonSwingUtils.putComponentOn(jPanel_setting, new JLabel("<<<その他>>>"), LABEL_WIDTH, PARTS_HEIGHT, SEP_WIDTH, y);
11511212 y+=(PARTS_HEIGHT+SEP_HEIGHT);
11521213
1153- int tbicons_w = 320;
1154- int tbicons_h = PARTS_HEIGHT*8;
1155- CommonSwingUtils.putComponentOn(jPanel_setting, getJLabel_toolbar("ツールバー表示対象項目の選択"), LABEL_WIDTH, PARTS_HEIGHT, SEP_WIDTH, y);
1156- CommonSwingUtils.putComponentOn(jPanel_setting, getJButton_toolbar_up("↑"), 50, PARTS_HEIGHT, LABEL_WIDTH+SEP_WIDTH+10+tbicons_w, y);
1157- CommonSwingUtils.putComponentOn(jPanel_setting, getJButton_toolbar_down("↓"), 50, PARTS_HEIGHT, LABEL_WIDTH+SEP_WIDTH+10+tbicons_w, y+PARTS_HEIGHT+SEP_WIDTH);
1158- CommonSwingUtils.putComponentOn(jPanel_setting, getJScrollPane_toolbar(), tbicons_w, tbicons_h, LABEL_WIDTH+SEP_WIDTH, y);
1159- CommonSwingUtils.putComponentOn(jPanel_setting, getJButton_toolbar_default("初期値"), 75, PARTS_HEIGHT, LABEL_WIDTH+SEP_WIDTH+10+tbicons_w, y+tbicons_h-PARTS_HEIGHT);
1160- y+=(tbicons_h+SEP_HEIGHT);
1161-
1162- CommonSwingUtils.putComponentOn(jPanel_setting, jSP_keywordWidth = new JSliderPanel("検索ボックスの横幅",LABEL_WIDTH,0,600,200), PARTS_WIDTH, PARTS_HEIGHT, SEP_WIDTH, y);
1163- jSP_keywordWidth.setValue(bounds.getSearchBoxAreaWidth());
1164- // RELOADリスナー不要
1165- y+=(PARTS_HEIGHT+SEP_HEIGHT);
1166-
1167- CommonSwingUtils.putComponentOn(jPanel_setting, jSP_detailRows = new JSliderPanel("詳細情報欄の行数(0:前回終了時の高さ)",LABEL_WIDTH,0,10,200), PARTS_WIDTH, PARTS_HEIGHT, SEP_WIDTH, y);
1168- jSP_detailRows.setValue(bounds.getDetailRows());
1169- y+=(PARTS_HEIGHT+SEP_HEIGHT);
1170-
1171- CommonSwingUtils.putComponentOn(jPanel_setting, jSP_statusRows = new JSliderPanel("ステータス欄の行数(0:前回終了時の高さ)",LABEL_WIDTH,0,10,200), PARTS_WIDTH, PARTS_HEIGHT, SEP_WIDTH, y);
1172- jSP_statusRows.setValue(bounds.getStatusRows());
1173- y+=(PARTS_HEIGHT+SEP_HEIGHT);
1174-
11751214 CommonSwingUtils.putComponentOn(jPanel_setting, jCBX_updateMethod = new JComboBoxPanel("起動時にアップデートを確認する",LABEL_WIDTH,250,true), PARTS_WIDTH, PARTS_HEIGHT, SEP_WIDTH, y);
11761215 for ( UpdateOn u : UpdateOn.values() ) {
11771216 jCBX_updateMethod.addItem(u);
@@ -1249,7 +1288,11 @@ public abstract class AbsSettingView extends JScrollPane {
12491288
12501289 int y = SEP_HEIGHT;
12511290
1291+ // 全体
1292+ y = createBlock0(y);
1293+
12521294 // リスト形式
1295+ y+=(BLOCK_SEP_HEIGHT);
12531296 y = createBlock1(y);
12541297
12551298 // 新聞形式
@@ -1312,6 +1355,35 @@ public abstract class AbsSettingView extends JScrollPane {
13121355
13131356 int idx;
13141357
1358+ // 全体
1359+ // 表示対象タブ
1360+ tabitems.clear();
1361+ for (int row=0; row<jTable_tabs.getRowCount(); row++) {
1362+ ListColumnInfo cb = new ListColumnInfo();
1363+ if (tab_selected[row])
1364+ cb.setVisible(true);
1365+ else
1366+ cb.setVisible((Boolean)jTable_tabs.getValueAt(row, 0));
1367+ cb.setName((String)jTable_tabs.getValueAt(row, 1));
1368+ cb.setId((Integer)jTable_tabs.getValueAt(row, 2));
1369+ tabitems.add(cb);
1370+ }
1371+
1372+ // ツールバーの表示順
1373+ tbicons.clear();
1374+ for (int row=0; row<jTable_toolbar.getRowCount(); row++) {
1375+ ListColumnInfo cb = new ListColumnInfo();
1376+ cb.setVisible((Boolean)jTable_toolbar.getValueAt(row, 0));
1377+ cb.setName((String)jTable_toolbar.getValueAt(row, 1));
1378+ cb.setId((Integer)jTable_toolbar.getValueAt(row, 2));
1379+ tbicons.add(cb);
1380+ }
1381+ bounds.setSearchBoxAreaWidth(jSP_keywordWidth.getValue());
1382+ bounds.setPagerComboWidth(jSP_pagerComboWidth.getValue());
1383+ bounds.setRecorderComboWidth(jSP_recorderComboWidth.getValue());
1384+ bounds.setDetailRows(jSP_detailRows.getValue());
1385+ bounds.setStatusRows(jSP_statusRows.getValue());
1386+
13151387 // リスト形式
13161388 env.setDisableFazzySearch(jCBP_disableFazzySearch.isSelected());
13171389 env.setDisableFazzySearchReverse(jCBP_disableFazzySearchReverse.isSelected());
@@ -1514,19 +1586,6 @@ public abstract class AbsSettingView extends JScrollPane {
15141586 env.setUseRundll32(jCBP_useRundll32.isSelected());
15151587 env.setDebug(jCBP_debug.isSelected());
15161588
1517- // ツールバーの表示順
1518- tbicons.clear();
1519- for (int row=0; row<jTable_toolbar.getRowCount(); row++) {
1520- ListColumnInfo cb = new ListColumnInfo();
1521- cb.setVisible((Boolean)jTable_toolbar.getValueAt(row, 0));
1522- cb.setName((String)jTable_toolbar.getValueAt(row, 1));
1523- cb.setId((Integer)jTable_toolbar.getValueAt(row, 2));
1524- tbicons.add(cb);
1525- }
1526- bounds.setSearchBoxAreaWidth(jSP_keywordWidth.getValue());
1527- bounds.setDetailRows(jSP_detailRows.getValue());
1528- bounds.setStatusRows(jSP_statusRows.getValue());
1529-
15301589 // 設定保存
15311590 setEnv(reload_prog_needed);
15321591 setUpdateButtonEnhanced(false);
@@ -1919,6 +1978,96 @@ public abstract class AbsSettingView extends JScrollPane {
19191978 }
19201979
19211980 /*
1981+ * ツールバー表示対象アイテムの選択
1982+ */
1983+ private JLabel getJLabel_toolbar(String s) {
1984+ if (jLabel_toolbar == null) {
1985+ jLabel_toolbar = new JLabel(s);
1986+ }
1987+ return jLabel_toolbar;
1988+ }
1989+
1990+ private JButton getJButton_toolbar_up(String s) {
1991+ if (jButton_toolbar_up == null) {
1992+ jButton_toolbar_up = new JButton(s);
1993+ jButton_toolbar_up.addMouseListener(new MouseAdapter() {
1994+ @Override
1995+ public void mouseClicked(MouseEvent e) {
1996+ moveSelRowInDispTable(jTable_toolbar, true);
1997+ }
1998+ });
1999+ }
2000+ return jButton_toolbar_up;
2001+ }
2002+
2003+ private JButton getJButton_toolbar_down(String s) {
2004+ if (jButton_toolbar_down == null) {
2005+ jButton_toolbar_down = new JButton(s);
2006+ jButton_toolbar_down.addMouseListener(new MouseAdapter() {
2007+ @Override
2008+ public void mouseClicked(MouseEvent e) {
2009+ moveSelRowInDispTable(jTable_toolbar, false);
2010+ }
2011+ });
2012+ }
2013+ return jButton_toolbar_down;
2014+ }
2015+
2016+ private JButton getJButton_toolbar_default(String s) {
2017+ if (jButton_toolbar_default == null) {
2018+ jButton_toolbar_default = new JButton(s);
2019+ jButton_toolbar_default.addMouseListener(new MouseAdapter() {
2020+ @Override
2021+ public void mouseClicked(MouseEvent e) {
2022+ ToolBarIconInfoList tbicons2 = new ToolBarIconInfoList();
2023+ tbicons2.setDefault();
2024+ setDefaultToDispTable(jTable_toolbar, tbicons2);
2025+ }
2026+ });
2027+ }
2028+ return jButton_toolbar_default;
2029+ }
2030+
2031+ private JScrollPane getJScrollPane_toolbar() {
2032+ if (jScrollPane_toolbar == null) {
2033+ jScrollPane_toolbar = new JScrollPane();
2034+ jScrollPane_toolbar.setViewportView(getJTable_toolbar());
2035+ jScrollPane_toolbar.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
2036+ }
2037+ return(jScrollPane_toolbar);
2038+ }
2039+ private JNETable getJTable_toolbar() {
2040+ if (jTable_toolbar == null) {
2041+ jTable_toolbar = getDispTable(tbicons);
2042+ }
2043+ return(jTable_toolbar);
2044+ }
2045+
2046+ /*
2047+ * 表示対象タブの選択
2048+ */
2049+ private JLabel getJLabel_tabs(String s) {
2050+ if (jLabel_tabs == null) {
2051+ jLabel_tabs = new JLabel(s);
2052+ }
2053+ return jLabel_tabs;
2054+ }
2055+ private JScrollPane getJScrollPane_tabs() {
2056+ if (jScrollPane_tabs == null) {
2057+ jScrollPane_tabs = new JScrollPane();
2058+ jScrollPane_tabs.setViewportView(getJTable_tabs());
2059+ jScrollPane_tabs.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
2060+ }
2061+ return(jScrollPane_tabs);
2062+ }
2063+ private JNETable getJTable_tabs() {
2064+ if (jTable_tabs == null) {
2065+ jTable_tabs = getDispTable(tabitems, tab_selected, tab_selected);
2066+ }
2067+ return(jTable_tabs);
2068+ }
2069+
2070+ /*
19222071 * User-Agent
19232072 */
19242073 private JLabel getJLabel_userAgent(String s)
@@ -2077,6 +2226,10 @@ public abstract class AbsSettingView extends JScrollPane {
20772226 }
20782227
20792228 private JNETable getDispTable(ArrayList<ListColumnInfo> list) {
2229+ return getDispTable(list, null, null);
2230+ }
2231+
2232+ private JNETable getDispTable(ArrayList<ListColumnInfo> list, boolean disables[], boolean selected[]) {
20802233 // ヘッダの設定
20812234 String[] colname = {"チェック", "アイテム", "ID"};
20822235 int[] colwidth = {50,250,0};
@@ -2135,6 +2288,14 @@ public abstract class AbsSettingView extends JScrollPane {
21352288 else {
21362289 cBox.setBackground(table.getBackground());
21372290 }
2291+
2292+ if (disables != null && disables.length > row && disables[row]){
2293+ cBox.setEnabled(false);
2294+ }
2295+ if (selected != null && selected.length > row && selected[row]){
2296+ cBox.setSelected(true);
2297+ }
2298+
21382299 return cBox;
21392300 }
21402301 };
@@ -2285,72 +2446,6 @@ public abstract class AbsSettingView extends JScrollPane {
22852446 }
22862447
22872448 /*
2288- * ツールバー表示対象アイテムの選択
2289- */
2290- private JLabel getJLabel_toolbar(String s) {
2291- if (jLabel_toolbar == null) {
2292- jLabel_toolbar = new JLabel(s);
2293- }
2294- return jLabel_toolbar;
2295- }
2296-
2297- private JButton getJButton_toolbar_up(String s) {
2298- if (jButton_toolbar_up == null) {
2299- jButton_toolbar_up = new JButton(s);
2300- jButton_toolbar_up.addMouseListener(new MouseAdapter() {
2301- @Override
2302- public void mouseClicked(MouseEvent e) {
2303- moveSelRowInDispTable(jTable_toolbar, true);
2304- }
2305- });
2306- }
2307- return jButton_toolbar_up;
2308- }
2309-
2310- private JButton getJButton_toolbar_down(String s) {
2311- if (jButton_toolbar_down == null) {
2312- jButton_toolbar_down = new JButton(s);
2313- jButton_toolbar_down.addMouseListener(new MouseAdapter() {
2314- @Override
2315- public void mouseClicked(MouseEvent e) {
2316- moveSelRowInDispTable(jTable_toolbar, false);
2317- }
2318- });
2319- }
2320- return jButton_toolbar_down;
2321- }
2322-
2323- private JButton getJButton_toolbar_default(String s) {
2324- if (jButton_toolbar_default == null) {
2325- jButton_toolbar_default = new JButton(s);
2326- jButton_toolbar_default.addMouseListener(new MouseAdapter() {
2327- @Override
2328- public void mouseClicked(MouseEvent e) {
2329- ToolBarIconInfoList tbicons2 = new ToolBarIconInfoList();
2330- tbicons2.setDefault();
2331- setDefaultToDispTable(jTable_toolbar, tbicons2);
2332- }
2333- });
2334- }
2335- return jButton_toolbar_default;
2336- }
2337-
2338- private JScrollPane getJScrollPane_toolbar() {
2339- if (jScrollPane_toolbar == null) {
2340- jScrollPane_toolbar = new JScrollPane();
2341- jScrollPane_toolbar.setViewportView(getJTable_toolbar());
2342- jScrollPane_toolbar.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
2343- }
2344- return(jScrollPane_toolbar);
2345- }
2346- private JNETable getJTable_toolbar() {
2347- if (jTable_toolbar == null) {
2348- jTable_toolbar = getDispTable(tbicons);
2349- }
2350- return(jTable_toolbar);
2351- }
2352-
2353- /*
23542449 * タイトル一覧の表示対象アイテムの選択
23552450 */
23562451 private JLabel getJLabel_title(String s) {
--- a/TinyBannavi/src/tainavi/AbsTitleDialog.java
+++ b/TinyBannavi/src/tainavi/AbsTitleDialog.java
@@ -283,7 +283,7 @@ abstract class AbsTitleDialog extends JDialog {
283283 return null;
284284
285285 String[] patterns = {
286- "^(.*?)(#|#)",
286+ "^(.*?)(#|#|♯)",
287287 "^(.*?)第.*?(話|回)",
288288 "^(.*?)(\\(|()[0-90-9]+(\\)|))"};
289289
@@ -319,7 +319,7 @@ abstract class AbsTitleDialog extends JDialog {
319319 return null;
320320
321321 String[] patterns = {
322- "(#|#)( | ){0,1}([0-90-9]{1,3})",
322+ "(#|#|♯)( | ){0,1}([0-90-9]{1,3})",
323323 "(\\(|()( | ){0,1}([0-90-9]{1,3})(\\)|)){0,1}",
324324 "(第)( | ){0,1}([0-90-9]{1,3})(話|回)"};
325325 String ntitle = Normalizer.normalize(title, Normalizer.Form.NFKC);
--- a/TinyBannavi/src/tainavi/AbsTitleListView.java
+++ b/TinyBannavi/src/tainavi/AbsTitleListView.java
@@ -95,6 +95,11 @@ public abstract class AbsTitleListView extends JPanel {
9595 protected abstract JMenuItem getMultiTitleDetailMenuItem(final String title, final String chnam,
9696 final String devId, final String [] ttlId, final String recId);
9797
98+ /*
99+ * 番組欄にジャンプするメニューアイテム
100+ */
101+ protected abstract JMenuItem getJumpMenuItem(final String title, final String chnam, final String startDT);
102+
98103 /**
99104 * タイトルを編集するメニューアイテム
100105 */
@@ -521,7 +526,7 @@ public abstract class AbsTitleListView extends JPanel {
521526 }
522527
523528 if ( ! rec.getErrmsg().equals("")) {
524- MWin.appendMessage(MSGID+"[追加情報] "+rec.getErrmsg());
529+ MWin.appendError(MSGID+"[追加情報] "+rec.getErrmsg());
525530 ringBeep();
526531 }
527532 }
@@ -576,7 +581,7 @@ public abstract class AbsTitleListView extends JPanel {
576581 MWin.appendError(ERRID+"レコーダからのタイトル一覧の取得に失敗しました:"+devId);
577582
578583 if ( ! rec.getErrmsg().equals("")) {
579- MWin.appendMessage(MSGID+"[追加情報] "+rec.getErrmsg());
584+ MWin.appendError(MSGID+"[追加情報] "+rec.getErrmsg());
580585 ringBeep();
581586 }
582587 }
@@ -1051,7 +1056,7 @@ public abstract class AbsTitleListView extends JPanel {
10511056 private final ActionListener al_editFolder = new ActionListener() {
10521057 @Override
10531058 public void actionPerformed(ActionEvent e) {
1054- int idx = jCBXPanel_folder.getSelectedIndex();
1059+// int idx = jCBXPanel_folder.getSelectedIndex();
10551060
10561061 HDDRecorder rec = getSelectedRecorder();
10571062 String folder_name = getSelectedFolderName();
@@ -1066,6 +1071,9 @@ public abstract class AbsTitleListView extends JPanel {
10661071 * フォルダーの作成ないし名称編集を行う
10671072 */
10681073 private void editFolderName( String folder_id, String nameOld){
1074+ String nameSel = getSelectedFolderName();
1075+ final boolean isSelected = nameSel != null && nameOld.equals(nameSel);
1076+
10691077 VWFolderDialog dlg = new VWFolderDialog();
10701078 CommonSwingUtils.setLocationCenter(parent, dlg);
10711079
@@ -1104,7 +1112,7 @@ public abstract class AbsTitleListView extends JPanel {
11041112 MWin.appendMessage(MSGID+"フォルダーを正常に" + action + "できました:"+folderNameWorking);
11051113 // [<device_name>]を先頭に付ける
11061114 removeListeners();
1107- updateFolderList(prefix + nameNew);
1115+ updateFolderList(isSelected ? prefix + nameNew : null);
11081116 updateFolderButtons();
11091117 updateTitleList(false, false, false, true, false, false);
11101118 addListeners();
@@ -1113,7 +1121,7 @@ public abstract class AbsTitleListView extends JPanel {
11131121 MWin.appendError(ERRID+"フォルダーの" + action + "に失敗しました:"+folderNameWorking);
11141122
11151123 if ( ! rec.getErrmsg().equals("")) {
1116- MWin.appendMessage(MSGID+"[追加情報] "+rec.getErrmsg());
1124+ MWin.appendError(MSGID+"[追加情報] "+rec.getErrmsg());
11171125 ringBeep();
11181126 }
11191127 }
@@ -1168,7 +1176,7 @@ public abstract class AbsTitleListView extends JPanel {
11681176 MWin.appendError(ERRID+"フォルダーの削除に失敗しました:"+folderNameWorking);
11691177 }
11701178 if ( ! rec.getErrmsg().equals("")) {
1171- MWin.appendMessage(MSGID+"[追加情報] "+rec.getErrmsg());
1179+ MWin.appendError(MSGID+"[追加情報] "+rec.getErrmsg());
11721180 ringBeep();
11731181 }
11741182
@@ -1385,6 +1393,7 @@ public abstract class AbsTitleListView extends JPanel {
13851393 TitleItem ra = rowView.get(row);
13861394 final String title = ra.title;
13871395 final String chnam = ra.chname;
1396+ final String startDT = ra.start;
13881397 final String recId = ra.recorder;
13891398 final String recName = recorders.getRecorderName(recId);
13901399 final String ttlId = ra.hide_ttlid;
@@ -1419,6 +1428,7 @@ public abstract class AbsTitleListView extends JPanel {
14191428 if (ttlIds != null)
14201429 pop.add(getMultiTitleDetailMenuItem(title, chnam, devId, ttlIds, recId));
14211430
1431+ appendSelectDeviceMenuItem(pop, ttlId);
14221432 appendSelectFolderMenuItem(pop, ttlId);
14231433
14241434 pop.addSeparator();
@@ -1439,6 +1449,8 @@ public abstract class AbsTitleListView extends JPanel {
14391449 pop.add(getRemoveMultiTitleMenuItem(title, chnam, devId, ttlIds, recId));
14401450
14411451 pop.addSeparator();
1452+ pop.add(getJumpMenuItem(title, chnam, startDT));
1453+ pop.addSeparator();
14421454
14431455 // クリップボードへコピーする
14441456 {
@@ -1943,6 +1955,54 @@ public abstract class AbsTitleListView extends JPanel {
19431955 }
19441956
19451957 /**
1958+ * デバイス絞り込みのメニューアイテムを追加する
1959+ */
1960+ protected void appendSelectDeviceMenuItem(final JPopupMenu pop, final String ttlId){
1961+ HDDRecorder rec = getSelectedRecorder();
1962+ TitleInfo ttl = rec.getTitleInfo(ttlId);
1963+
1964+ if (rec == null || ttl == null)
1965+ return;
1966+
1967+ String devNameOld = (String)jCBXPanel_device.getSelectedItem();
1968+ String devIdOld = rec.getDeviceID(devNameOld);
1969+ if (devIdOld == null)
1970+ return;
1971+
1972+ String devNameNew = ttl.getRec_device();
1973+ String folderName = getSelectedFolderName();
1974+
1975+ pop.addSeparator();
1976+
1977+ if (devIdOld.equals(HDDRecorder.DEVICE_ALL)){
1978+ JMenuItem menuItem = new JMenuItem("デバイスを選択する【"+devNameNew+"】");
1979+ menuItem.addActionListener(new ActionListener() {
1980+ public void actionPerformed(ActionEvent e) {
1981+ updateDeviceList(devNameNew);
1982+ updateDeviceInfoLabel();
1983+ updateFolderList(folderName);
1984+ updateTitleList(false, false, false , false, false, false);
1985+ }
1986+ });
1987+
1988+ pop.add(menuItem);
1989+ }
1990+ else{
1991+ JMenuItem menuItem = new JMenuItem("デバイスの選択を解除する");
1992+ menuItem.addActionListener(new ActionListener() {
1993+ public void actionPerformed(ActionEvent e) {
1994+ updateDeviceList(rec.getDeviceName(HDDRecorder.DEVICE_ALL));
1995+ updateDeviceInfoLabel();
1996+ updateFolderList(folderName);
1997+ updateTitleList(false, false, false, false, false, false);
1998+ }
1999+ });
2000+
2001+ pop.add(menuItem);
2002+ }
2003+ }
2004+
2005+ /**
19462006 * フォルダー絞り込みのメニューアイテムを追加する
19472007 */
19482008 protected void appendSelectFolderMenuItem(final JPopupMenu pop, final String ttlId){
@@ -1956,10 +2016,8 @@ public abstract class AbsTitleListView extends JPanel {
19562016 if (folders == null || folders.isEmpty())
19572017 return;
19582018
1959- String deviceId = ttl.getRec_device();
19602019 String folderName = folders.get(0).getText();
1961-
1962- pop.addSeparator();
2020+ String folderId = folderName != null ? text2value(rec.getFolderList(), folderName) : "";
19632021
19642022 int idx = jCBXPanel_folder.getSelectedIndex();
19652023 if (idx == 0){
@@ -1985,6 +2043,18 @@ public abstract class AbsTitleListView extends JPanel {
19852043
19862044 pop.add(menuItem);
19872045 }
2046+
2047+ if (!folderId.isEmpty()){
2048+ JMenuItem menuItem = new JMenuItem("フォルダを編集する【"+folderName+"】");
2049+ menuItem.addActionListener(new ActionListener() {
2050+ public void actionPerformed(ActionEvent e) {
2051+
2052+ editFolderName(folderId, folderName);
2053+ }
2054+ });
2055+
2056+ pop.add(menuItem);
2057+ }
19882058 }
19892059
19902060 }
--- a/TinyBannavi/src/tainavi/ChannelSettingPanel.java
+++ b/TinyBannavi/src/tainavi/ChannelSettingPanel.java
@@ -30,15 +30,15 @@ import javax.swing.table.TableModel;
3030
3131 /**
3232 * CH設定について、放送の種類の別に独立したパネルを用意
33- * @version 3.15.4β
33+ * @version 3.15.4β
3434 */
3535 public class ChannelSettingPanel extends JPanel {
3636
3737 private static final long serialVersionUID = 1L;
38-
38+
3939 public static void setDebug(boolean b) {debug = b; }
4040 private static boolean debug = false;
41-
41+
4242 /*
4343 * メンバ
4444 */
@@ -49,32 +49,32 @@ public class ChannelSettingPanel extends JPanel {
4949 private VWColorChooserDialog ccwin = null;
5050 private StatusWindow stwin = null;
5151 private Component parent = null;
52-
52+
5353 /**
5454 * 現在使用されているプラグイン
5555 */
5656 private TVProgram usingNow = null;
57-
57+
5858 /**
5959 * <P>起動時 {@link #getUsingPluginForInit()}でclone()
6060 * <P>番組表を切り替えたとき {@link #getEditingPluginForEdit()}でclone()
6161 */
6262 private TVProgram editingNow = null;
63-
63+
6464 private static final String flTextNormal = "Webサイトから放送局リストを取得し直す";
6565 private static final String flTextWarn = "「更新を確定する」を実行してください";
6666
67-
68-
67+
68+
6969 /*******************************************************************************
7070 * 定数
7171 ******************************************************************************/
72-
72+
7373 //private static final int PARTS_WIDTH = 900;
7474 private static final int PARTS_HEIGHT = 30;
7575 private static final int SEP_WIDTH = 10;
7676 private static final int SEP_HEIGHT = 10;
77-
77+
7878 private static final int LABEL_WIDTH = 250;
7979 private static final int BUTTON_WIDTH = 50;
8080 private static final int BUTTON_WIDTH_LONG = 100;
@@ -88,36 +88,36 @@ public class ChannelSettingPanel extends JPanel {
8888 private static final String MSGID = "[CH設定パネル] ";
8989 private static final String ERRID = "[ERROR]"+MSGID;
9090 private static final String DBGID = "[DEBUG]"+MSGID;
91-
91+
9292 // カラム設定
93-
93+
9494 private static enum ChSetColumn {
9595 CENTER ("有効無効", TABLE_NAME_WIDTH),
9696 AREA ("エリア", TABLE_AREA_WIDTH),
9797 COLOR ("色", TABLE_COLOR_WIDTH),
9898 ;
99-
99+
100100 private String name;
101101 private int width;
102-
102+
103103 private ChSetColumn(String name, int width) {
104104 this.name = name;
105105 this.width = width;
106106 }
107-
107+
108108 String getName() { return name; }
109-
109+
110110 int getIniWidth() { return width; }
111-
111+
112112 int getColumn() { return ordinal(); }
113113 }
114-
114+
115115 /*******************************************************************************
116116 * 部品
117117 ******************************************************************************/
118118
119119 // コンポーネント
120-
120+
121121 private JComboBox jComboBox_progplugin = null;
122122 private JComboBox jComboBox_area = null;
123123 private JScrollPane jScrollPane_enable = null;
@@ -132,17 +132,17 @@ public class ChannelSettingPanel extends JPanel {
132132 private JButton jButton_opt = null;
133133 //private JTextAreaWithPopup jTextArea_opt = null;
134134 private JTextFieldWithPopup jTextField_opt = null;
135-
135+
136136 // コンポーネント以外
137-
137+
138138 /*******************************************************************************
139139 * コンストラクタ
140140 ******************************************************************************/
141-
141+
142142 public ChannelSettingPanel(String label, TVProgramList progPlugins, final String selectedsite, boolean hasArea, VWColorChooserDialog ccwin, StatusWindow stwin, Component parent) {
143-
143+
144144 super();
145-
145+
146146 // 初期化
147147 this.label = label;
148148 this.progPlugins = progPlugins;
@@ -150,20 +150,20 @@ public class ChannelSettingPanel extends JPanel {
150150 this.ccwin = ccwin;
151151 this.stwin = stwin;
152152 this.parent = parent;
153-
153+
154154 // パーツの組み立て
155155 this.setLayout(new SpringLayout());
156-
156+
157157 //コンポーネントの生成
158158 getMyComponents();
159-
159+
160160 // 起動時に選択されているWeb番組表プラグインの情報を反映する
161161 getUsingPluginForInit(selectedsite);
162162 }
163-
163+
164164 private void getMyComponents() {
165165 int y = SEP_HEIGHT;
166-
166+
167167 int x = SEP_WIDTH;
168168 CommonSwingUtils.putComponentOn(this, new JLabel(label), LABEL_WIDTH, PARTS_HEIGHT, x, y);
169169 x += LABEL_WIDTH+SEP_WIDTH;
@@ -181,7 +181,7 @@ public class ChannelSettingPanel extends JPanel {
181181 y+=(PARTS_HEIGHT+SEP_HEIGHT);
182182 x = SEP_WIDTH+LABEL_WIDTH+SEP_WIDTH;
183183 CommonSwingUtils.putComponentOn(this, getJScrollPane_enable(), TABLE_WIDTH, TABLE_HEIGHT, x, y);
184-
184+
185185 int yz = y+TABLE_HEIGHT/2;
186186 int xz = x + SEP_WIDTH+TABLE_WIDTH;
187187 CommonSwingUtils.putComponentOn(this, getJButton_d2e("<"), BUTTON_WIDTH, PARTS_HEIGHT, xz, yz-PARTS_HEIGHT-SEP_HEIGHT/2);
@@ -190,36 +190,36 @@ public class ChannelSettingPanel extends JPanel {
190190 yz = y+TABLE_HEIGHT-PARTS_HEIGHT*2-SEP_HEIGHT;
191191 CommonSwingUtils.putComponentOn(this, getJButton_up("↑"), BUTTON_WIDTH, PARTS_HEIGHT, xz, yz);
192192 CommonSwingUtils.putComponentOn(this, getJButton_down("↓"), BUTTON_WIDTH, PARTS_HEIGHT, xz, yz+SEP_HEIGHT+PARTS_HEIGHT);
193-
193+
194194 xz += BUTTON_WIDTH+SEP_WIDTH;
195195 CommonSwingUtils.putComponentOn(this, getJScrollPane_disable(), TABLE_WIDTH, TABLE_HEIGHT, xz, y);
196-
196+
197197 int panel_w = xz+TABLE_WIDTH+SEP_WIDTH;
198-
198+
199199 y+=(TABLE_HEIGHT+SEP_HEIGHT);
200-
200+
201201 int tt_l = TABLE_WIDTH*2+SEP_WIDTH*2+BUTTON_WIDTH;
202202 CommonSwingUtils.putComponentOn(this, new JLabel("オプション指定(形式:KEY=VAL;)"), LABEL_WIDTH, PARTS_HEIGHT, SEP_WIDTH, y);
203203 CommonSwingUtils.putComponentOn(this, getJTextArea_opt(), tt_l-BUTTON_WIDTH_LONG-SEP_WIDTH, PARTS_HEIGHT, x, y);
204- CommonSwingUtils.putComponentOn(this, getJButton_opt("futuer use."), BUTTON_WIDTH_LONG, PARTS_HEIGHT, x+tt_l-BUTTON_WIDTH_LONG, y);
204+ CommonSwingUtils.putComponentOn(this, getJButton_opt("future use."), BUTTON_WIDTH_LONG, PARTS_HEIGHT, x+tt_l-BUTTON_WIDTH_LONG, y);
205205
206206 y+=(PARTS_HEIGHT+SEP_HEIGHT);
207-
207+
208208 //y += SEP_HEIGHT;
209-
209+
210210 Dimension d = new Dimension(panel_w,y);
211211 this.setPreferredSize(d);
212212 this.setBorder(new LineBorder(new Color(0,0,0)));
213213 }
214-
214+
215215 /*******************************************************************************
216216 * アクション
217217 ******************************************************************************/
218-
218+
219219 /*
220220 * 公開メソッド
221221 */
222-
222+
223223 /**
224224 * 選択中の放送局を返却する
225225 */
@@ -260,12 +260,12 @@ public class ChannelSettingPanel extends JPanel {
260260 }
261261 return false;
262262 }
263-
264-
263+
264+
265265 /*
266266 * 非公開
267267 */
268-
268+
269269 /**
270270 * <P>インスタンス作成時に編集するプラグインを選択する
271271 * <P>起動時一回のみの実行
@@ -277,7 +277,7 @@ public class ChannelSettingPanel extends JPanel {
277277 stwin.appendError(ERRID+"【致命的】プラグインが1つも登録されていません: "+selectedsite);
278278 return false;
279279 }
280-
280+
281281 // 起動時に選択されていたプラグインはusingNowである
282282 TVProgram p = progPlugins.getProgPlugin(selectedsite);
283283 if ( p == null ) {
@@ -288,20 +288,20 @@ public class ChannelSettingPanel extends JPanel {
288288 System.out.println(MSGID+"番組表プラグインの初期値です: "+selectedsite+" -> "+p.getTVProgramId());
289289 }
290290 usingNow = p;
291-
291+
292292 // 初期化
293293 p.loadAreaCode();
294294 p.loadCenter(p.getSelectedCode(), false);
295295 p.setSortedCRlist();
296-
296+
297297 final String area = (p.getSelectedArea()==null)?(p.getDefaultArea()):p.getSelectedArea();
298-
298+
299299 TatCount tc = new TatCount();
300300 stwin.appendMessage(MSGID+"選択されている番組表: "+p.getTVProgramId()+" / "+area);
301-
301+
302302 // 編集対象editingNowは、現時点ではusingNowと同じである
303303 editingNow = p.clone();
304-
304+
305305 // MacOSXで起動時ハングアップが発生することがあるのでトラップコードを入れてみた
306306 try {
307307 // プラグイン選択
@@ -318,54 +318,54 @@ public class ChannelSettingPanel extends JPanel {
318318 jComboBox_area.setSelectedItem(editingNow.getSelectedArea());
319319 jComboBox_area.addItemListener(il_areaChanged);
320320 }
321-
321+
322322 // テーブルへ設定する
323323 addCentersToTable(jTable_enable, jTable_disable, editingNow);
324-
324+
325325 if (CommonUtils.isMac()) System.err.println(DBGID+"mac debug 1");
326-
326+
327327 // オプションの扱い
328328 String opt = editingNow.getOptString();
329329 setOptionFieldEnabled(opt);
330-
330+
331331 if (CommonUtils.isMac()) System.err.println(DBGID+"mac debug 2");
332332 }
333333 catch (Exception e) {
334334 e.printStackTrace();
335335 stwin.appendError(ERRID+"[致命的エラー] 異常動作です。製作元に連絡してください。");
336336 }
337-
337+
338338 stwin.appendMessage(String.format("%s番組表が初期化されました。所要時間: %.2f秒 %s %s",MSGID,tc.end(),p.getTVProgramId(),p.getSelectedArea()));
339-
339+
340340 return true;
341341 }
342-
342+
343343 /**
344344 * プラグイン選択コンボボックスを操作した場合
345345 */
346346 private boolean getEditingPluginForEdit() {
347-
347+
348348 // コンボボックスで選択されたプラグインは?
349349 TVProgram p = progPlugins.getProgPlugin(getSelectedPluginId());
350350 if ( p == null ) {
351351 System.err.println(ERRID+"【致命的】選択されたプラグインのインスタンスがみつかりません: "+getSelectedPluginId());
352352 return false;
353353 }
354-
354+
355355 stwin.clear();
356-
356+
357357 TatCount tc = new TatCount();
358358 stwin.appendMessage(MSGID+"選択された番組表: "+p.getTVProgramId()+" / "+p.getSelectedArea());
359-
359+
360360 // これだね
361361 editingNow = p.clone();
362-
362+
363363 new SwingBackgroundWorker(false) {
364364 @Override
365365 protected Object doWorks() throws Exception {
366366 // あればファイル、なければWebから
367367 editingNow.loadAreaCode();
368-
368+
369369 String code = editingNow.getCode(usingNow.getSelectedArea());
370370 if ( code != null ) {
371371 editingNow.setSelectedAreaByName(usingNow.getSelectedArea());
@@ -376,7 +376,7 @@ public class ChannelSettingPanel extends JPanel {
376376 }
377377 editingNow.loadCenter(editingNow.getSelectedCode(), false);
378378 editingNow.setSortedCRlist();
379-
379+
380380 // エリア選択
381381 if (hasArea) {
382382 jComboBox_area.removeItemListener(il_areaChanged);
@@ -388,19 +388,19 @@ public class ChannelSettingPanel extends JPanel {
388388 jComboBox_area.setSelectedItem(editingNow.getSelectedArea());
389389 jComboBox_area.addItemListener(il_areaChanged);
390390 }
391-
391+
392392 if ( editingNow.getSortedCRlist().size() == 0 && usingNow.getSortedCRlist().size() > 0 ) {
393393 stwin.appendMessage(MSGID+"有効局が未設定のエリアのため放送局情報の引き継ぎをこころみます ");
394394 inheritEnabledCenters(editingNow, usingNow);
395395 }
396-
396+
397397 // テーブルへ設定する
398398 addCentersToTable(jTable_enable, jTable_disable, editingNow);
399-
399+
400400 // オプションの扱い
401401 String opt = editingNow.getOptString();
402402 setOptionFieldEnabled(opt);
403-
403+
404404 return null;
405405 }
406406 @Override
@@ -408,15 +408,15 @@ public class ChannelSettingPanel extends JPanel {
408408 stwin.setVisible(false);
409409 }
410410 }.execute();
411-
411+
412412 CommonSwingUtils.setLocationCenter(parent, (Component) stwin);
413413 stwin.setVisible(true);
414-
414+
415415 stwin.appendMessage(String.format("%s番組表が切り替わりました。所要時間: %.2f秒 %s %s",MSGID,tc.end(),p.getTVProgramId(),p.getSelectedArea()));
416-
416+
417417 return true;
418418 }
419-
419+
420420 /**
421421 * エリア選択コンボボックスを操作した場合
422422 */
@@ -428,27 +428,27 @@ public class ChannelSettingPanel extends JPanel {
428428 System.err.println(ERRID+"【致命的】選択されたエリア情報がみつかりません: "+getSelectedPluginId()+" "+getSelectedArea());
429429 return false;
430430 }
431-
431+
432432 stwin.clear();
433-
433+
434434 TatCount tc = new TatCount();
435435 stwin.appendMessage(MSGID+"選択されたエリア: "+editingNow.getTVProgramId()+" / "+getSelectedArea());
436-
436+
437437 new SwingBackgroundWorker(false) {
438438 @Override
439439 protected Object doWorks() throws Exception {
440440 // あればファイル、なければWebから
441441 editingNow.loadCenter(code, false);
442442 editingNow.setSortedCRlist();
443-
443+
444444 if ( editingNow.getSortedCRlist().size() == 0 && usingNow.getSortedCRlist().size() > 0 ) {
445445 System.out.println(MSGID+"有効局が未設定のエリアのため情報の引き継ぎをこころみます ");
446446 inheritEnabledCenters(editingNow, usingNow);
447447 }
448-
448+
449449 // テーブルへ設定する
450450 addCentersToTable(jTable_enable, jTable_disable, editingNow);
451-
451+
452452 return null;
453453 }
454454 @Override
@@ -456,12 +456,12 @@ public class ChannelSettingPanel extends JPanel {
456456 stwin.setVisible(false);
457457 }
458458 }.execute();
459-
459+
460460 CommonSwingUtils.setLocationCenter(parent, (Component) stwin);
461461 stwin.setVisible(true);
462-
462+
463463 stwin.appendMessage(String.format("%sエリアが切り替わりました。所要時間: %.2f秒 %s %s",MSGID,tc.end(),editingNow.getTVProgramId(),editingNow.getSelectedArea()));
464-
464+
465465 return true;
466466 }
467467
@@ -471,14 +471,14 @@ public class ChannelSettingPanel extends JPanel {
471471 private boolean getCenterListFromWeb() {
472472
473473 setReloadButtonEnhanced(true);
474-
474+
475475 stwin.clear();
476-
476+
477477 TatCount tc = new TatCount();
478478 stwin.appendMessage(MSGID+"選択されたエリア: "+editingNow.getTVProgramId()+" / "+getSelectedArea());
479-
479+
480480 final TVProgram tmp = editingNow.clone();
481-
481+
482482 new SwingBackgroundWorker(false) {
483483 @Override
484484 protected Object doWorks() throws Exception {
@@ -486,19 +486,19 @@ public class ChannelSettingPanel extends JPanel {
486486 String code = editingNow.getCode(getSelectedArea());
487487 editingNow.loadCenter(code, true);
488488 editingNow.setSortedCRlist();
489-
489+
490490 if ( editingNow.getSortedCRlist().size() == 0 && tmp.getSortedCRlist().size() > 0 ) {
491491 // editingNowが未選択状態であれば、以前の選択状態を引き継ぎたい
492492 inheritEnabledCenters(editingNow, tmp);
493493 }
494-
494+
495495 // テーブルへ設定する
496496 addCentersToTable(jTable_enable, jTable_disable, editingNow);
497-
497+
498498 // オプションの扱い
499499 String opt = editingNow.getOptString();
500500 setOptionFieldEnabled(opt);
501-
501+
502502 return null;
503503 }
504504 @Override
@@ -506,15 +506,15 @@ public class ChannelSettingPanel extends JPanel {
506506 stwin.setVisible(false);
507507 }
508508 }.execute();
509-
509+
510510 CommonSwingUtils.setLocationCenter(parent, (Component) stwin);
511511 stwin.setVisible(true);
512-
512+
513513 stwin.appendMessage(String.format("%s放送局リストを再読み込みしました。所要時間: %.2f秒 %s %s",MSGID,tc.end(),editingNow.getTVProgramId(),editingNow.getSelectedArea()));
514-
514+
515515 return true;
516516 }
517-
517+
518518 /**
519519 * 番組表再取得ボタンを強調表示したりもどしたりする
520520 */
@@ -528,12 +528,12 @@ public class ChannelSettingPanel extends JPanel {
528528 jButton_forceload.setForeground(Color.BLACK);
529529 }
530530 }
531-
531+
532532 // 選択中のプラグインを返却する
533533 private String getSelectedPluginId() {
534534 return (String) jComboBox_progplugin.getSelectedItem();
535535 }
536-
536+
537537 // 選択中のエリアを返却する
538538 private String getSelectedArea() {
539539 return ((hasArea)?((String) jComboBox_area.getSelectedItem()):(null));
@@ -543,17 +543,17 @@ public class ChannelSettingPanel extends JPanel {
543543 private String getOptionField() {
544544 return jTextField_opt.getText();
545545 }
546-
546+
547547 // 放送局リストに並び順を設定する
548548 private void setChOrder(TVProgram progplugin) {
549-
549+
550550 RowItemList<ChSetItem> eRowdata = jTable_enable.getRowData();
551551
552552 // 局順クリア
553553 for ( Center center : progplugin.getCRlist() ) {
554554 center.setOrder(0);
555555 }
556-
556+
557557 // 局順・色セット
558558 for ( int row=0; row<eRowdata.size(); row++ ) {
559559 ChSetItem c = eRowdata.get(row);
@@ -568,32 +568,32 @@ public class ChannelSettingPanel extends JPanel {
568568 }
569569 }
570570 }
571-
571+
572572 // ソート済みリスト作成
573573 progplugin.setSortedCRlist();
574574 }
575-
575+
576576 // 放送局リストに背景色を設定する
577577 private void setChBgColor(TVProgram progplugin) {
578-
578+
579579 RowItemList<ChSetItem> eRowdata = jTable_enable.getRowData();
580580
581581 for ( int row=0; row<eRowdata.size(); row++ ) {
582582 progplugin.getSortedCRlist().get(row).setBgColor(CommonUtils.str2color(eRowdata.get(row).color));
583583 }
584584 }
585-
585+
586586 /**
587587 * 放送局をテーブルに書き込む
588588 */
589589 private void addCentersToTable(ChSetTable eTable, ChSetTable dTable, TVProgram program) {
590-
590+
591591 RowItemList<ChSetItem> eRowdata = eTable.getRowData();
592592 RowItemList<ChSetItem> dRowdata = dTable.getRowData();
593-
593+
594594 eRowdata.clear();
595595 dRowdata.clear();
596-
596+
597597 for ( int order=1; order <= program.getCRlist().size(); order++ ) {
598598 Center center = null;
599599 for ( Center cr : program.getCRlist() ) {
@@ -625,24 +625,24 @@ public class ChannelSettingPanel extends JPanel {
625625 ((DefaultTableModel) eTable.getModel()).fireTableDataChanged();
626626 ((DefaultTableModel) dTable.getModel()).fireTableDataChanged();
627627 }
628-
628+
629629 /**
630630 * <P>有効局の引き継ぎ
631631 * <P>有効局が空の番組表を選択した場合にカレントの番組表から放送局の順序などを引き継ぐ
632632 */
633633 private void inheritEnabledCenters(TVProgram editing, TVProgram using) {
634-
634+
635635 // 既存の設定のあるものは引き継ぎを行わない
636636 if ( editing.getSortedCRlist().size() > 0 ) {
637637 return;
638638 }
639-
639+
640640 int order = 1;
641641 for ( Center ocr : using.getSortedCRlist() ) {
642642 Center xcr = null;
643643 for ( Center ncr : editing.getCRlist() ) {
644644 if ( ncr.getCenter().equals(ocr.getCenter()) ) {
645- xcr = ncr;
645+ xcr = ncr;
646646 if (editing.getArea(ncr.getAreaCode()).equals(using.getArea(ocr.getAreaCode()))) {
647647 // エリアが等しいものがあればそれを採用する
648648 break;
@@ -655,24 +655,24 @@ public class ChannelSettingPanel extends JPanel {
655655 xcr.setBgColor(ocr.getBgColor());
656656 }
657657 }
658-
658+
659659 // 整理して終わり
660660 editing.setSortedCRlist();
661661 }
662-
662+
663663 // 左右
664664 private void moveChSrcToDst(ChSetTable sTable, ChSetTable dTable)
665665 {
666666 RowItemList<ChSetItem> sRowData = sTable.getRowData();
667667 RowItemList<ChSetItem> dRowData = dTable.getRowData();
668-
668+
669669 if ( sRowData.size() <= 0 ) {
670670 return;
671671 }
672-
672+
673673 int top = sTable.getSelectedRow();
674674 int length = sTable.getSelectedRowCount();
675-
675+
676676 RowItemList<ChSetItem> tmp = new RowItemList<ChSetItem>();
677677 for ( int i=top; i<top+length; i++) {
678678 tmp.add(sRowData.get(i));
@@ -681,17 +681,17 @@ public class ChannelSettingPanel extends JPanel {
681681 dRowData.add(tmp.get(i));
682682 sRowData.remove(tmp.get(i));
683683 }
684-
684+
685685 ((DefaultTableModel) sTable.getModel()).fireTableDataChanged();
686686 ((DefaultTableModel) dTable.getModel()).fireTableDataChanged();
687687 }
688-
688+
689689 // DISに戻したものをもとの行にかえしてあげる
690690 private void refreshChDisOrder(ChSetTable table)
691691 {
692692 RowItemList<ChSetItem> rowdata = table.getRowData();
693693 RowItemList<ChSetItem> tmp = new RowItemList<ChSetItem>();
694-
694+
695695 for ( Center cr : editingNow.getCRlist() ) {
696696 for ( ChSetItem c : rowdata ) {
697697 if ( cr.getCenter().equals(c.centername) && cr.getAreaCode().equals(editingNow.getCode(c.area))) {
@@ -700,15 +700,15 @@ public class ChannelSettingPanel extends JPanel {
700700 }
701701 }
702702 }
703-
703+
704704 rowdata.clear();
705705 for ( ChSetItem c : tmp ) {
706706 rowdata.add(c);
707707 }
708-
708+
709709 ((DefaultTableModel) table.getModel()).fireTableDataChanged();
710710 }
711-
711+
712712 // 上下
713713 private void chUp(ChSetTable table)
714714 {
@@ -716,13 +716,13 @@ public class ChannelSettingPanel extends JPanel {
716716 int length = table.getSelectedRowCount();
717717
718718 RowItemList<ChSetItem> rowdata = table.getRowData();
719-
719+
720720 if ( top <= 0 ) {
721721 return;
722722 }
723-
723+
724724 rowdata.up(top, length);
725-
725+
726726 ((DefaultTableModel) table.getModel()).fireTableDataChanged();
727727 table.setRowSelectionInterval(top-1, top-1+(length-1));
728728 }
@@ -730,24 +730,24 @@ public class ChannelSettingPanel extends JPanel {
730730 {
731731 int top = table.getSelectedRow();
732732 int length = table.getSelectedRowCount();
733-
733+
734734 RowItemList<ChSetItem> rowdata = table.getRowData();
735-
735+
736736 if ( (top+length) >= rowdata.size() ) {
737737 return;
738738 }
739739
740740 rowdata.down(top, length);
741-
741+
742742 ((DefaultTableModel) table.getModel()).fireTableDataChanged();
743743 table.setRowSelectionInterval(top+1, top+1+(length-1));
744744 }
745-
746-
745+
746+
747747 /*******************************************************************************
748748 * リスナー
749749 ******************************************************************************/
750-
750+
751751 /**
752752 * Web番組表コンボボックスを操作することで起動されるリスナー
753753 */
@@ -760,7 +760,7 @@ public class ChannelSettingPanel extends JPanel {
760760 getEditingPluginForEdit();
761761 }
762762 };
763-
763+
764764 /**
765765 * 放送エリア
766766 */
@@ -773,7 +773,7 @@ public class ChannelSettingPanel extends JPanel {
773773 setAreaForEdit();
774774 }
775775 };
776-
776+
777777 /**
778778 * 放送局一覧再取得
779779 */
@@ -783,7 +783,7 @@ public class ChannelSettingPanel extends JPanel {
783783 getCenterListFromWeb();
784784 }
785785 };
786-
786+
787787 /**
788788 * 放送局ごとの色
789789 */
@@ -794,24 +794,24 @@ public class ChannelSettingPanel extends JPanel {
794794 //
795795 JTable t = (JTable) e.getSource();
796796 Point p = e.getPoint();
797-
797+
798798 int col = t.columnAtPoint(p);
799799 if (col != 2) {
800800 return;
801801 }
802-
802+
803803 int row = t.rowAtPoint(p);
804804 //
805805 ccwin.setColor(CommonUtils.str2color((String) t.getValueAt(row,2)));
806806 ccwin.setVisible(true);
807-
807+
808808 if (ccwin.getSelectedColor() != null ) {
809809 t.setValueAt(CommonSwingUtils.getColoredString(ccwin.getSelectedColor(),"-"), row, 2);
810810 }
811811 }
812812 }
813813 };
814-
814+
815815 /**
816816 * オプションが編集されたっぽい
817817 */
@@ -828,7 +828,7 @@ public class ChannelSettingPanel extends JPanel {
828828 public void changedUpdate(DocumentEvent e) {
829829 }
830830 };
831-
831+
832832 private void setOptionButtonEnabled(boolean b) {
833833 if ( b ) {
834834 jButton_opt.setEnabled(true);
@@ -839,8 +839,8 @@ public class ChannelSettingPanel extends JPanel {
839839 jButton_opt.setForeground(Color.DARK_GRAY);
840840 }
841841 }
842-
843-
842+
843+
844844 /**
845845 * オプション入力エリア
846846 */
@@ -856,44 +856,44 @@ public class ChannelSettingPanel extends JPanel {
856856 jTextField_opt.setText(opt);
857857 }
858858 }
859-
859+
860860 /*
861861 * 部品
862862 */
863-
863+
864864 /**
865865 * Web番組表プラグインの切り替えコンボボックス
866866 */
867867 private JComboBox getJComboBox_progplugin() {
868868 if (jComboBox_progplugin == null) {
869-
869+
870870 jComboBox_progplugin = new JComboBox();
871-
871+
872872 // 選択値の初期化(ここはやめるべき?)
873873 for ( TVProgram p : progPlugins ) {
874874 jComboBox_progplugin.addItem(p.getTVProgramId());
875875 }
876-
876+
877877 // Web番組表コンボボックスにリスナーを追加
878878 jComboBox_progplugin.addItemListener(il_progChanged);
879879 }
880880 return jComboBox_progplugin;
881881 }
882-
882+
883883 /**
884884 * エリアの切り替えコンボボックス
885885 */
886886 private JComboBox getJComboBox_area() {
887887 if (jComboBox_area == null) {
888-
888+
889889 jComboBox_area = new JComboBox();
890-
890+
891891 // エリアコンボボックスにリスナーを追加
892892 jComboBox_area.addItemListener(il_areaChanged);
893893 }
894894 return jComboBox_area;
895895 }
896-
896+
897897 // 放送局リスト(有効)
898898 private JScrollPane getJScrollPane_enable() {
899899 if (jScrollPane_enable == null) {
@@ -903,7 +903,7 @@ public class ChannelSettingPanel extends JPanel {
903903 }
904904 return(jScrollPane_enable);
905905 }
906-
906+
907907 // 放送局リスト(無効)
908908 private JScrollPane getJScrollPane_disable() {
909909 if (jScrollPane_disable == null) {
@@ -913,9 +913,9 @@ public class ChannelSettingPanel extends JPanel {
913913 }
914914 return(jScrollPane_disable);
915915 }
916-
916+
917917 private ChSetTable getJTable_tvcenter(boolean isEnabled, int col1_w, int col2_w, int col3_w) {
918-
918+
919919 ArrayList<String> cola = new ArrayList<String>();
920920 ArrayList<Integer> wida = new ArrayList<Integer>();
921921 for ( ChSetColumn cs : ChSetColumn.values() ) {
@@ -929,27 +929,27 @@ public class ChannelSettingPanel extends JPanel {
929929 }
930930 String[] colname = cola.toArray(new String[0]);
931931 Integer[] colwidth = wida.toArray(new Integer[0]);
932-
932+
933933 ChSetTable jTable_tvcenter = getJTableWithFormat(colname, colwidth);
934-
934+
935935 // 重要!
936936 jTable_tvcenter.setRowData(new RowItemList<ChSetItem>());
937-
937+
938938 jTable_tvcenter.getTableHeader().setReorderingAllowed(false);
939939 jTable_tvcenter.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
940-
940+
941941 // 色選択欄のみレンダラが独自
942942 VWColorCellRenderer renderer = new VWColorCellRenderer();
943943 jTable_tvcenter.getColumn(ChSetColumn.COLOR.getName()).setCellRenderer(renderer);
944-
944+
945945 // 有効リストのみ色選択リスナーが付く
946946 if ( isEnabled ) {
947947 jTable_tvcenter.addMouseListener(colorSelectionAdapter);
948948 }
949-
949+
950950 return(jTable_tvcenter);
951951 }
952-
952+
953953 private ChSetTable getJTableWithFormat(String[] s, Integer[] w) {
954954 //
955955 DefaultTableModel model = new DefaultTableModel(s,0);
@@ -963,7 +963,7 @@ public class ChannelSettingPanel extends JPanel {
963963 }
964964 return(jTable);
965965 }
966-
966+
967967 // 左右ボタン
968968 private JButton getJButton_d2e(String s) {
969969 if (jButton_d2e == null) {
@@ -988,7 +988,7 @@ public class ChannelSettingPanel extends JPanel {
988988 }
989989 return(jButton_e2d);
990990 }
991-
991+
992992 // 上下ボタン
993993 private JButton getJButton_up(String s) {
994994 if (jButton_up == null) {
@@ -1014,7 +1014,7 @@ public class ChannelSettingPanel extends JPanel {
10141014 }
10151015 return(jButton_down);
10161016 }
1017-
1017+
10181018 // 放送局リストを再構築する
10191019 private JButton getJButton_forceload(String s) {
10201020 if (jButton_forceload == null) {
@@ -1023,7 +1023,7 @@ public class ChannelSettingPanel extends JPanel {
10231023 }
10241024 return(jButton_forceload);
10251025 }
1026-
1026+
10271027 /**
10281028 * フリーオプションの保存ボタン
10291029 */
@@ -1041,7 +1041,7 @@ public class ChannelSettingPanel extends JPanel {
10411041 }
10421042 return(jButton_opt);
10431043 }
1044-
1044+
10451045 /**
10461046 * フリーオプション領域
10471047 */
@@ -1050,25 +1050,25 @@ public class ChannelSettingPanel extends JPanel {
10501050 jTextField_opt = new JTextFieldWithPopup();
10511051 jTextField_opt.setBorder(new LineBorder(Color.BLACK));
10521052 jTextField_opt.getDocument().addDocumentListener(optionEditedListener);
1053-
1053+
10541054 }
10551055 return jTextField_opt;
10561056 }
1057-
1057+
10581058 /*******************************************************************************
10591059 * 独自部品
10601060 ******************************************************************************/
10611061
10621062 // テーブルの行データの構造
10631063 private class ChSetItem extends RowItem implements Cloneable {
1064-
1064+
10651065 // 表示メンバ
10661066 String centername;
10671067 String area;
10681068 String color;
1069-
1069+
10701070 // 非表示メンバ
1071-
1071+
10721072 @Override
10731073 protected void myrefresh(RowItem o) {
10741074 ChSetItem c = (ChSetItem) o;
@@ -1076,11 +1076,11 @@ public class ChannelSettingPanel extends JPanel {
10761076 c.addData(area);
10771077 c.addData(color);
10781078 }
1079-
1079+
10801080 public ChSetItem clone() {
10811081 return (ChSetItem) super.clone();
10821082 }
1083-
1083+
10841084 public void set(int pos, String value) {
10851085 if ( pos == ChSetColumn.CENTER.getColumn() )
10861086 {
@@ -1095,53 +1095,53 @@ public class ChannelSettingPanel extends JPanel {
10951095 color = value;
10961096 }
10971097 }
1098-
1098+
10991099 }
11001100
11011101 // ChSetItemを使ったJTable拡張
11021102 private class ChSetTable extends JNETable {
11031103
11041104 private static final long serialVersionUID = 1L;
1105-
1105+
11061106 private RowItemList<ChSetItem> rowdata = null;
11071107
11081108 public void setRowData(RowItemList<ChSetItem> rowdata) { this.rowdata = rowdata; }
11091109 public RowItemList<ChSetItem> getRowData() { return rowdata; }
1110-
1110+
11111111 public ChSetTable(boolean b) {
11121112 super(b);
11131113 }
1114-
1114+
11151115 public ChSetTable(TableModel d, boolean b) {
11161116 super(d, b);
11171117 }
1118-
1118+
11191119 @Override
11201120 public Object getValueAt(int row, int column) {
1121-
1121+
11221122 int vrow = this.convertRowIndexToModel(row);
11231123 ChSetItem c = rowdata.get(vrow);
11241124 return c.get(column);
1125-
1125+
11261126 }
1127-
1127+
11281128 @Override
11291129 public void setValueAt(Object aValue, int row, int column) {
1130-
1130+
11311131 int vrow = this.convertRowIndexToModel(row);
11321132 ChSetItem c = rowdata.get(vrow);
11331133 c.set(column,(String) aValue);
11341134 c.fireChanged();
1135-
1135+
11361136 }
1137-
1137+
11381138 @Override
11391139 public int getRowCount() {
1140-
1140+
11411141 return rowdata.size();
1142-
1142+
11431143 }
1144-
1144+
11451145 }
11461146
11471147 }
--- a/TinyBannavi/src/tainavi/Env.java
+++ b/TinyBannavi/src/tainavi/Env.java
@@ -961,6 +961,8 @@ public class Env {
961961 public void setFontSize(int f) { fontSize = f; }
962962 private int fontSize = 12;
963963
964+ public int ZMSIZE(int size){ return size*fontSize/12; }
965+
964966 public boolean getUseGTKRC() { return useGTKRC; }
965967 public void setUseGTKRC(boolean b) { useGTKRC = b; }
966968 private boolean useGTKRC = true;
--- /dev/null
+++ b/TinyBannavi/src/tainavi/TabInfoList.java
@@ -0,0 +1,139 @@
1+package tainavi;
2+
3+import java.io.File;
4+import java.util.ArrayList;
5+
6+/**
7+ * タイトル一覧で {@link ListColumnInfo} のリストを実現するクラスです.
8+ * @since 3.22.18β+1.9
9+ */
10+public class TabInfoList extends ArrayList<ListColumnInfo> implements Cloneable{
11+
12+ private static final long serialVersionUID = 1L;
13+
14+ private static final String listFile = "env"+File.separator+"tabinfolist.xml";
15+
16+ @Override
17+ public Object clone(){
18+ TabInfoList p = new TabInfoList();
19+
20+ for (ListColumnInfo li : this){
21+ p.add((ListColumnInfo)li.clone());
22+ }
23+
24+ return p;
25+ }
26+
27+ public ListColumnInfo getVisibleAt(int column){
28+ int cno = 0;
29+ for (ListColumnInfo li : this){
30+ if ( !li.getVisible() )
31+ continue;
32+
33+ if (cno == column)
34+ return li;
35+
36+ cno++;
37+ }
38+
39+ return null;
40+ }
41+
42+ public boolean getVisibleAt(String name){
43+ if (name == null)
44+ return false;
45+
46+ for (ListColumnInfo li : this){
47+ if (name.equals(li.getName()))
48+ return li.getVisible();
49+
50+ }
51+
52+ return false;
53+ }
54+
55+ /*
56+ * JTableに指定する列名の配列を作成する
57+ */
58+ public String [] getColNames(){
59+ // カラム名の初期化
60+ ArrayList<String> cola = new ArrayList<String>();
61+
62+ for ( ListColumnInfo li : this ) {
63+ if ( li.getVisible() ) {
64+ cola.add(li.getName());
65+ }
66+ }
67+
68+ return cola.toArray(new String[0]);
69+ }
70+
71+ /*
72+ * ファイルに保存する
73+ */
74+ public boolean save() {
75+ System.out.println("タブ表示項目設定を保存します: "+listFile);
76+
77+ if ( ! CommonUtils.writeXML(listFile, this) ) {
78+ System.err.println("タブ表示項目設定の保存に失敗しました: "+listFile);
79+ return false;
80+ }
81+
82+ return true;
83+ }
84+
85+ /*
86+ * ファイルから読み込む
87+ */
88+ public boolean load() {
89+ System.out.println("タブ表示項目設定を読み込みます: "+listFile);
90+
91+ ArrayList<ListColumnInfo> cl = null;
92+
93+ if ( new File(listFile).exists() ) {
94+ // ファイルがあるならロード
95+ cl = (TabInfoList) CommonUtils.readXML(listFile);
96+ }
97+
98+ if ( cl == null || cl.size() == 0 ) {
99+ System.err.println("タブ表示項目設定が読み込めなかったのでデフォルト設定で起動します.");
100+
101+ // 初期化してみよう
102+ setDefault();
103+
104+ return false;
105+ }
106+
107+ this.clear();
108+ for (ListColumnInfo c : cl) {
109+ this.add(c);
110+ }
111+
112+ return true;
113+ }
114+
115+ /*
116+ * デフォルトの設定にする
117+ */
118+ public void setDefault(){
119+ this.clear();
120+
121+ int idx = 1;
122+ Object[][] o = {
123+ {true, "リスト形式", idx++},
124+ {true, "新聞形式", idx++},
125+ {true, "本体予約一覧", idx++},
126+ {true, "録画結果一覧", idx++},
127+ {true, "自動予約一覧", idx++},
128+ {true, "タイトル一覧", idx++},
129+ {true, "設定一覧", idx++},
130+ };
131+ for (int i=0; i<o.length; i++) {
132+ ListColumnInfo cb = new ListColumnInfo();
133+ cb.setVisible((Boolean) o[i][0]);
134+ cb.setName((String) o[i][1]);
135+ cb.setId((Integer) o[i][2]);
136+ this.add(cb);
137+ }
138+ }
139+}
--- a/TinyBannavi/src/tainavi/VWMainWindow.java
+++ b/TinyBannavi/src/tainavi/VWMainWindow.java
@@ -24,7 +24,7 @@ public class VWMainWindow extends JPanel {
2424 RECED ("録画結果一覧"),
2525 AUTORES ("自動予約一覧"),
2626 TITLED ("タイトル一覧"),
27- SETTING ("各種設定"),
27+ SETTING ("設定一覧"),
2828 RECSET ("レコーダ設定"),
2929 CHSET ("CH設定"),
3030 CHSORT ("CHソート設定"),
@@ -62,6 +62,7 @@ public class VWMainWindow extends JPanel {
6262 private final String SETTING_LIST = "設定一覧";
6363
6464 private Bounds bounds = null;
65+ private TabInfoList tabitems = null;
6566
6667 /*
6768 * 部品
@@ -79,6 +80,7 @@ public class VWMainWindow extends JPanel {
7980
8081 public VWMainWindow(Viewer v) {
8182 bounds = v.getBoundsEnv();
83+ tabitems = v.getTabItemEnv();
8284
8385 this.setLayout(new BorderLayout());
8486 this.add(getJSplitPane(), BorderLayout.CENTER);
@@ -86,16 +88,9 @@ public class VWMainWindow extends JPanel {
8688 jSplitPane.setTopComponent(getJTabbedPane());
8789 getJTabbedPane_settings();
8890
89- // タブを全部準備する
90- for ( MWinTab tab : MWinTab.values() ) {
91- if ( tab == MWinTab.SETTING ) {
92- jTabbedPane.add(jTabbedPane_settings, SETTING_LIST);
93- }
94- addTab(null, tab);
95- }
91+ addAllTabs();
9692 }
9793
98-
9994 /*
10095 * 公開メソッド
10196 */
@@ -183,62 +178,200 @@ public class VWMainWindow extends JPanel {
183178 });
184179 }
185180
186- // タブを追加する
187- public boolean addTab(Component comp, MWinTab tab) {
188- if ( jTabbedPane.getTabCount() + jTabbedPane_settings.getTabCount() < tab.getIndex() ) {
189- System.err.println(String.format("[DEBUG][メインウィンドウ] タブの数があわない: %d/%d", jTabbedPane.getTabCount(), tab.getIndex()));
190- return false;
181+ /*
182+ * 設定情報を反映する
183+ */
184+ public void reflectEnv(){
185+ addAllTabs();
186+ }
187+
188+ /*
189+ * すべてのタブを追加する
190+ */
191+ public void addAllTabs(){
192+ jTabbedPane.removeAll();
193+ jTabbedPane_settings.removeAll();
194+
195+ // タブを全部準備する
196+ for ( MWinTab tab : MWinTab.values() ) {
197+ // 設定タブでない非表示のタブはスキップする
198+ if (!isSettingTab(tab) && tabitems.getVisibleAt(tab.getName()) == false)
199+ continue;
200+
201+ // 設定タブを追加する
202+ if ( tab == MWinTab.SETTING ) {
203+ jTabbedPane.add(jTabbedPane_settings, SETTING_LIST);
204+ }
205+
206+ // タブを追加する
207+ addTab(null, tab);
191208 }
209+ }
192210
193- int tabIndex = tab.getIndex();
194- JTabbedPane tabPane = jTabbedPane;
195- if ( tabIndex >= MWinTab.SETTING.getIndex() ) {
196- tabIndex -= MWinTab.SETTING.getIndex();
197- tabPane = jTabbedPane_settings;
211+ /*
212+ * タブを追加する
213+ */
214+ public boolean addTab(Component comp, MWinTab tab) {
215+ int index = 0;
216+ JTabbedPane pane = jTabbedPane;
217+
218+ // 追加先のペインとインデックスを決める
219+ if ( isSettingTab(tab) ) {
220+ pane = jTabbedPane_settings;
221+ index = getSettingTabIndex(tab);
198222 }
199- if ( tabPane.getTabCount() > tabIndex ) {
200- tabPane.remove(tabIndex);
223+ else{
224+ pane = jTabbedPane;
225+ index = getTabIndex(tab);
201226 }
202- tabPane.add(comp, tab.getName(), tabIndex);
227+
228+ // 表示対象でない場合はなにもしない
229+ if (index == -1)
230+ return false;
231+
232+ // すでにタブがあればいったん削除する
233+ if ( pane.getTabCount() > index ) {
234+ pane.remove(index);
235+ }
236+
237+ // ペインにタブを追加する
238+ pane.add(comp, tab.getName(), index);
239+
203240 return true;
204241 }
205242
206- // タブを切り替える
243+ /*
244+ * タブを切り替える
245+ */
207246 public void setSelectedTab(MWinTab tab) {
208247 if ( tab == null ) {
209248 jTabbedPane.setSelectedIndex(-1);
210249 return;
211250 }
212- if ( tab.getIndex() >= MWinTab.SETTING.getIndex() ) {
213- jTabbedPane_settings.setSelectedIndex(tab.getIndex()-MWinTab.SETTING.getIndex());
214- jTabbedPane.setSelectedIndex(MWinTab.SETTING.getIndex());
251+
252+ // 設定タブの場合
253+ if ( isSettingTab(tab) ) {
254+ jTabbedPane_settings.setSelectedIndex(getSettingTabIndex(tab));
255+ jTabbedPane.setSelectedIndex(getTabIndex(MWinTab.SETTING));
215256 return;
216257 }
217- jTabbedPane.setSelectedIndex(tab.getIndex());
258+
259+ // それ以外のタブの場合
260+ // 非表示のタブの場合無視する
261+ int index = getTabIndex(tab);
262+ if (index == -1)
263+ return;
264+
265+ // タブを選択する
266+ jTabbedPane.setSelectedIndex(index);
218267 }
219268
220- //
269+ /*
270+ * 設定タブを初期選択する
271+ */
272+ public void initSettingTabSelect(){
273+ if (jTabbedPane_settings.getTabCount() > 0)
274+ jTabbedPane_settings.setSelectedIndex(0);
275+ }
276+
277+ /*
278+ * 指定されたタブのコンポーネントを取得する
279+ */
221280 public Component getTab(MWinTab tab) {
222- if ( tab.getIndex() >= MWinTab.SETTING.getIndex() ) {
223- return jTabbedPane_settings.getComponent(tab.getIndex() - MWinTab.SETTING.getIndex());
281+ // 設定タブの場合
282+ if ( isSettingTab(tab) ) {
283+ return jTabbedPane_settings.getComponent(getSettingTabIndex(tab));
224284 }
225- return jTabbedPane.getComponent(tab.getIndex());
285+
286+ // 非表示のタブの場合無視する
287+ int index = getTabIndex(tab);
288+ if (index == -1)
289+ return null;
290+
291+ return jTabbedPane.getComponent(index);
226292 }
227293
228- // タブが選択されているか確認する
294+ /*
295+ * タブが選択されているか確認する
296+ */
229297 public boolean isTabSelected(MWinTab tab) {
230- if ( tab.getIndex() >= MWinTab.SETTING.getIndex() ) {
231- return (jTabbedPane.getSelectedIndex() == MWinTab.SETTING.getIndex() && jTabbedPane_settings.getSelectedIndex() == tab.getIndex()-MWinTab.SETTING.getIndex());
298+ // 設定タブの場合
299+ if ( isSettingTab(tab) ) {
300+ return (jTabbedPane.getSelectedIndex() == getTabIndex(MWinTab.SETTING) &&
301+ jTabbedPane_settings.getSelectedIndex() == getSettingTabIndex(tab));
232302 }
233- return (jTabbedPane.getSelectedIndex() == tab.getIndex());
303+
304+ // 非表示のタブの場合無視する
305+ int index = getTabIndex(tab);
306+ if (index == -1)
307+ return false;
308+
309+ return (jTabbedPane.getSelectedIndex() == index);
234310 }
235311
236312 // どのタブが選択されているのやら
237313 public MWinTab getSelectedTab() {
238- if ( jTabbedPane.getSelectedIndex() == MWinTab.SETTING.getIndex() ) {
239- return MWinTab.getAt(jTabbedPane.getSelectedIndex());
314+ if ( jTabbedPane.getSelectedIndex() == getTabIndex(MWinTab.SETTING) ) {
315+ return getSettingTabAt(jTabbedPane_settings.getSelectedIndex());
240316 }
241- return MWinTab.getAt(jTabbedPane.getSelectedIndex());
317+ return getTabAt(jTabbedPane.getSelectedIndex());
318+ }
319+
320+ /*
321+ * タブの表示INDEXを取得する
322+ */
323+ public int getTabIndex(MWinTab tab){
324+ int index=0;
325+ for ( MWinTab tab2 : MWinTab.values() ) {
326+ if (tabitems.getVisibleAt(tab2.getName()) == false)
327+ continue;
328+
329+ if (tab.getIndex() == tab2.getIndex())
330+ return index;
331+
332+ index++;
333+ }
334+
335+ return -1;
336+ }
337+
338+ /*
339+ * 設定タブの表示INDEXを取得する
340+ */
341+ public int getSettingTabIndex(MWinTab tab){
342+ return tab.getIndex() - MWinTab.SETTING.getIndex();
343+ }
344+
345+ /*
346+ * 指定されたINDEXのタブを取得する
347+ */
348+ public MWinTab getTabAt(int index){
349+ int index2=0;
350+ for ( MWinTab tab : MWinTab.values() ) {
351+ if (tabitems.getVisibleAt(tab.getName()) == false)
352+ continue;
353+
354+ if (index == index2)
355+ return tab;
356+
357+ index2++;
358+ }
359+
360+ return null;
361+ }
362+
363+ /*
364+ * 指定されたINDEXの設定タブを取得する
365+ */
366+ public MWinTab getSettingTabAt(int index){
367+ return MWinTab.getAt(MWinTab.SETTING.getIndex()+index);
368+ }
369+
370+ /*
371+ * 指定されたタブは設定用のタブか
372+ */
373+ public boolean isSettingTab(MWinTab tab){
374+ return tab.getIndex() >= MWinTab.SETTING.getIndex();
242375 }
243376
244377 // 設定タブをトグル切り替え
--- a/TinyBannavi/src/tainavi/VersionInfo.java
+++ b/TinyBannavi/src/tainavi/VersionInfo.java
@@ -5,7 +5,7 @@ import java.util.regex.Pattern;
55
66
77 public class VersionInfo {
8- private static final String Version = "タイニー番組ナビゲータ for DBR-T2007 3.22.18β+1.12.10";
8+ private static final String Version = "タイニー番組ナビゲータ for DBR-T2007 3.22.18β+1.12.11";
99
1010 private static final String OSname = System.getProperty("os.name");
1111 private static final String OSvers = System.getProperty("os.version");
--- a/TinyBannavi/src/tainavi/Viewer.java
+++ b/TinyBannavi/src/tainavi/Viewer.java
@@ -122,6 +122,7 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener,H
122122 // タイトル一覧ビューの表示項目
123123 private final ListedNodeInfoList lnitems = new ListedNodeInfoList(); // リスト形式ビューのツリー表示項目
124124 private final ToolBarIconInfoList tbicons = new ToolBarIconInfoList(); // ツールバーの表示項目
125+ private final TabInfoList tabitems = new TabInfoList(); // タブの表示項目
125126
126127 private final PaperColorsMap pColors = new PaperColorsMap(); // 新聞形式のジャンル別背景色の設定
127128 private final AVSetting avs = new AVSetting(); // ジャンル別録画画質・音質等設定
@@ -351,7 +352,7 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener,H
351352 private final VWStatusWindow stwin = new VWStatusWindow();
352353 private final VWStatusTextArea mwin = new VWStatusTextArea();
353354 private final VWColorChooserDialog ccwin = new VWColorChooserDialog();
354- private final VWPaperColorsDialog pcwin = new VWPaperColorsDialog();
355+ private VWPaperColorsDialog pcwin = null;
355356 private final VWReserveDialog rdialog = new VWReserveDialog(0, 0);
356357
357358 // 初期化処理の中で生成していくもの
@@ -378,6 +379,7 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener,H
378379 * パブリック関数
379380 ******************************************************************************/
380381 public Bounds getBoundsEnv(){ return bounds; }
382+ public TabInfoList getTabItemEnv(){ return tabitems; }
381383
382384 /*******************************************************************************
383385 * タブやダイアログのインスタンス作成用クラス定義
@@ -772,6 +774,9 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener,H
772774
773775 @Override
774776 protected String getSelectedRecorderOnToolbar() { return toolBar.getSelectedRecorder(); }
777+
778+ @Override
779+ protected boolean isTabSelected(MWinTab tab) { return mainWindow.isTabSelected(tab); }
775780 }
776781
777782
@@ -989,6 +994,12 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener,H
989994 return menuItem;
990995 }
991996
997+ @Override
998+ protected JMenuItem getJumpMenuItem(final String title, final String chnam, final String startDT){
999+
1000+ return Viewer.this.getJumpMenuItem(title, chnam, startDT);
1001+ }
1002+
9921003 /**
9931004 * タイトルを編集するメニューアイテム
9941005 */
@@ -1373,6 +1384,8 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener,H
13731384 @Override
13741385 protected ToolBarIconInfoList getTbIconEnv(){ return tbicons; }
13751386 @Override
1387+ protected TabInfoList getTabItemEnv(){ return tabitems; }
1388+ @Override
13761389 protected VWLookAndFeel getLAFEnv() { return vwlaf; }
13771390 @Override
13781391 protected VWFont getFontEnv() { return vwfont; }
@@ -4731,6 +4744,7 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener,H
47314744 tlitems.save();
47324745 lnitems.save();
47334746 tbicons.save();
4747+ tabitems.save();
47344748 env.save();
47354749
47364750 // CommonUtilsの設定変更
@@ -4763,6 +4777,8 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener,H
47634777 setSettingProgPluginAll(env);
47644778
47654779 toolBar.reflectEnv();
4780+ mainWindow.reflectEnv();
4781+ addAllTabs();
47664782
47674783 // リスト形式の再構築
47684784 listed.reflectNodeEnv();
@@ -5008,6 +5024,7 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener,H
50085024 tlitems.load();
50095025 lnitems.load();
50105026 tbicons.load();
5027+ tabitems.load();
50115028
50125029 // サイズ・位置情報取得
50135030 bounds.setLoaded(bounds.load());
@@ -5590,7 +5607,6 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener,H
55905607 SwingUtilities.updateComponentTreeUI(this);
55915608 SwingUtilities.updateComponentTreeUI(stwin);
55925609 SwingUtilities.updateComponentTreeUI(mwin);
5593- SwingUtilities.updateComponentTreeUI(pcwin);
55945610 SwingUtilities.updateComponentTreeUI(rdialog);
55955611 SwingUtilities.updateComponentTreeUI(ccwin);
55965612 }
@@ -5615,6 +5631,8 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener,H
56155631
56165632 // コンポーネント作成
56175633 {
5634+ pcwin = new VWPaperColorsDialog();
5635+
56185636 // メインウィンドウの作成
56195637 mainWindow = new VWMainWindow(this);
56205638
@@ -5652,18 +5670,7 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener,H
56525670 mainWindow.addStatusArea(mwin);
56535671
56545672 // タブ群
5655- mainWindow.addTab(listed, MWinTab.LISTED);
5656- mainWindow.addTab(paper, MWinTab.PAPER);
5657- mainWindow.addTab(reserved, MWinTab.RSVED);
5658- mainWindow.addTab(recorded, MWinTab.RECED);
5659- mainWindow.addTab(autores, MWinTab.AUTORES);
5660- mainWindow.addTab(titled, MWinTab.TITLED);
5661- mainWindow.addTab(setting, MWinTab.SETTING);
5662- mainWindow.addTab(recsetting, MWinTab.RECSET);
5663- mainWindow.addTab(chsetting, MWinTab.CHSET);
5664- mainWindow.addTab(chsortsetting, MWinTab.CHSORT);
5665- mainWindow.addTab(chconvsetting, MWinTab.CHCONV);
5666- mainWindow.addTab(chdatsetting, MWinTab.CHDAT);
5673+ addAllTabs();
56675674 }
56685675
56695676 // ステータスエリアを開く
@@ -5676,6 +5683,25 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener,H
56765683 return true;
56775684 }
56785685
5686+ /*
5687+ * すべてのタブを追加する
5688+ */
5689+ private void addAllTabs(){
5690+ mainWindow.addTab(listed, MWinTab.LISTED);
5691+ mainWindow.addTab(paper, MWinTab.PAPER);
5692+ mainWindow.addTab(reserved, MWinTab.RSVED);
5693+ mainWindow.addTab(recorded, MWinTab.RECED);
5694+ mainWindow.addTab(autores, MWinTab.AUTORES);
5695+ mainWindow.addTab(titled, MWinTab.TITLED);
5696+ mainWindow.addTab(setting, MWinTab.SETTING);
5697+ mainWindow.addTab(recsetting, MWinTab.RECSET);
5698+ mainWindow.addTab(chsetting, MWinTab.CHSET);
5699+ mainWindow.addTab(chsortsetting, MWinTab.CHSORT);
5700+ mainWindow.addTab(chconvsetting, MWinTab.CHCONV);
5701+ mainWindow.addTab(chdatsetting, MWinTab.CHDAT);
5702+ mainWindow.initSettingTabSelect();
5703+ }
5704+
56795705 private void ShowInitTab() {
56805706
56815707 // いったん無選択状態にしてから
@@ -6452,9 +6478,6 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener,H
64526478 System.exit(1);
64536479 }
64546480
6455- // 背景色設定ダイアログにフォント名の一覧を設定する
6456- pcwin.setFontList(vwfont);
6457-
64586481 // (新聞形式の)ツールチップの表示時間を変更する
64596482 setTooltipDelay();
64606483
@@ -6468,6 +6491,9 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener,H
64686491 System.exit(1);
64696492 }
64706493
6494+ // 背景色設定ダイアログにフォント名の一覧を設定する
6495+ pcwin.setFontList(vwfont);
6496+
64716497 // ★★★★★★★★★★
64726498 //int x = 2/0; // サブスレッドの突然死のトラップを確認するためのコード
64736499 // ★★★★★★★★★★
--- a/TinyBannavi/src/tainavi/plugintv/PlugIn_TVPDimora.java
+++ b/TinyBannavi/src/tainavi/plugintv/PlugIn_TVPDimora.java
@@ -61,6 +61,7 @@ public class PlugIn_TVPDimora extends TVProgramUtils implements TVProgram,Clonea
6161 private final String ERRID = "[ERROR]"+MSGID;
6262 private final String DBGID = "[DEBUG]"+MSGID;
6363
64+ private final String PROGCACHE_PREFIX = "Dimora_";
6465
6566 /*******************************************************************************
6667 * 部品
@@ -98,6 +99,10 @@ public class PlugIn_TVPDimora extends TVProgramUtils implements TVProgram,Clonea
9899 public boolean loadProgram(String areaCode, boolean force) {
99100 setCacheFileOnly(true);
100101
102+ if (!force && loadFromProgCache(PROGCACHE_PREFIX + areaCode)){
103+ return true;
104+ }
105+
101106 // 入れ物を空にする
102107 newplist = new ArrayList<ProgList>();
103108 nf.clear();
@@ -243,6 +248,9 @@ public class PlugIn_TVPDimora extends TVProgramUtils implements TVProgram,Clonea
243248 pcenter.clear();
244249 pcenter = newplist;
245250 newplist = null;
251+
252+ saveToProgCache(PROGCACHE_PREFIX + areaCode);
253+
246254 return true;
247255 }
248256