import java.util.ArrayList;\r
import java.util.Arrays;\r
\r
-import javax.swing.AbstractAction;\r
import javax.swing.AbstractCellEditor;\r
import javax.swing.DefaultCellEditor;\r
import javax.swing.JButton;\r
cc.save(webChName, recChName, chCode);\r
\r
// ここがあるのでSwingBackgroundWorkerを使わざるをえない\r
- for ( HDDRecorder rec : recorders.get(recId) ) {\r
+ for ( HDDRecorder rec : recorders.findPlugin(recId) ) {\r
// 関連するプラグインを全部リロードする\r
rec.getChCode().load(false); // ログ出力あり\r
rec.GetRdReserve(false);\r
return;\r
}\r
\r
- ArrayList<HDDRecorder> ra = recorders.get(recId);\r
+ ArrayList<HDDRecorder> ra = recorders.findPlugin(recId);\r
if ( ra.size() == 0 ) {\r
MWin.appendError(ERRID+"指定のレコーダのプラグインがみつかりません: "+recId);\r
return;\r
private static final long serialVersionUID = 1L;\r
\r
private static final String LABEL = "SET";\r
- private final JButton renderButton = new JButton(LABEL);\r
+ \r
+ private final JButton renderButton;\r
private final JButton editorButton;\r
private Boolean cellValue = Boolean.FALSE;\r
\r
public ButtonColumn() {\r
super();\r
- editorButton = new JButton(new AbstractAction(LABEL) {\r
-\r
- private static final long serialVersionUID = 1L;\r
-\r
- public void actionPerformed(ActionEvent e) {\r
- fireEditingStopped();\r
- \r
- int row = jTable_entries.getSelectedRow();\r
- \r
- ChDatItem c = rowData.get(row);\r
+ renderButton = new JButton(LABEL);\r
+ editorButton = new JButton(LABEL);\r
+ editorButton.addActionListener(al_set);\r
+ }\r
+ \r
+ private final ActionListener al_set = new ActionListener() {\r
+ \r
+ @Override\r
+ public void actionPerformed(ActionEvent e) {\r
+ fireEditingStopped();\r
+ \r
+ int row = jTable_entries.getSelectedRow();\r
+ \r
+ ChDatItem c = rowData.get(row);\r
+ \r
+ String chCode = c.chCode;\r
+ if ( chCode.length() == 0 ) {\r
\r
- String chCode = c.chCode;\r
- if ( chCode.length() == 0 ) {\r
- \r
- // レコーダプラグインが持っているチャンネルコードバリューを検索する\r
- if ( selectedRecorder.isChValueAvailable() ) {\r
- // 新バージョン\r
- String recChName = c.recChName;\r
- for ( TextValueSet t : selectedRecorder.getChValue() ) {\r
- if ( recChName.equals(t.getText()) ) {\r
- c.chCode = t.getValue();\r
- break;\r
- }\r
+ // レコーダプラグインが持っているチャンネルコードバリューを検索する\r
+ if ( selectedRecorder.isChValueAvailable() ) {\r
+ // 新バージョン\r
+ String recChName = c.recChName;\r
+ for ( TextValueSet t : selectedRecorder.getChValue() ) {\r
+ if ( recChName.equals(t.getText()) ) {\r
+ c.chCode = t.getValue();\r
+ break;\r
}\r
}\r
- else if ( selectedRecorder.getChValue().size() > 0 ) {\r
- // 旧バージョン(置き換えていきたい)\r
- String recChName = c.recChName;\r
- if ( selectedRecorder.getRecorderId().startsWith("DIGA ") ) {\r
- // for DIGA ONLY\r
- for ( TextValueSet t : selectedRecorder.getChValue() ) {\r
- if ( recChName.startsWith(t.getText()+" ") ) {\r
- String val = t.getValue();\r
- if ( val != null ) {\r
- c.chCode = recChName.replaceFirst(t.getText()+" ","")+":"+val;\r
- }\r
- break;\r
+ }\r
+ else if ( selectedRecorder.getChValue().size() > 0 ) {\r
+ // 旧バージョン(置き換えていきたい)\r
+ String recChName = c.recChName;\r
+ if ( selectedRecorder.getRecorderId().startsWith("DIGA ") ) {\r
+ // for DIGA ONLY\r
+ for ( TextValueSet t : selectedRecorder.getChValue() ) {\r
+ if ( recChName.startsWith(t.getText()+" ") ) {\r
+ String val = t.getValue();\r
+ if ( val != null ) {\r
+ c.chCode = recChName.replaceFirst(t.getText()+" ","")+":"+val;\r
}\r
+ break;\r
}\r
}\r
- else {\r
- // for RD ONLY\r
- for ( TextValueSet t : selectedRecorder.getChValue() ) {\r
- if ( t.getText().equals(recChName) ) {\r
- String val = t.getValue();\r
- if ( val != null ) {\r
- c.chCode = val;\r
- }\r
- break;\r
+ }\r
+ else {\r
+ // for RD ONLY\r
+ for ( TextValueSet t : selectedRecorder.getChValue() ) {\r
+ if ( t.getText().equals(recChName) ) {\r
+ String val = t.getValue();\r
+ if ( val != null ) {\r
+ c.chCode = val;\r
}\r
+ break;\r
}\r
}\r
}\r
- \r
- c.fireChanged();\r
- jTable_entries.clearSelection();\r
- jTable_entries.setRowSelectionInterval(row, row);\r
}\r
+ \r
+ c.fireChanged();\r
+ jTable_entries.clearSelection();\r
+ jTable_entries.setRowSelectionInterval(row, row);\r
}\r
- });\r
- }\r
+ }\r
+ };\r
\r
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {\r
ChDatItem c = rowData.get(row);\r
long diff = 86400L*30L;\r
\r
String myself = getSelectedRecorderOnToolbar();\r
- HDDRecorderList recs = recorders.getMyself(myself);\r
+ HDDRecorderList recs = recorders.findInstance(myself);\r
\r
// コンボボックスの指定はピックアップである\r
boolean isPickupOnly = ( myself != null && myself.length() == 0 ) ;\r
private Marker _getReservedMarkCharUra(ListedItem data) {\r
//\r
String myself = getSelectedRecorderOnToolbar();\r
- HDDRecorderList recs = recorders.getMyself(myself);\r
+ HDDRecorderList recs = recorders.findInstance(myself);\r
\r
for ( HDDRecorder rec : recs )\r
{\r
\r
// ピックアップはここに入らない\r
\r
- HDDRecorderList recs = recorders.getMyself(myself);\r
+ HDDRecorderList recs = recorders.findInstance(myself);\r
\r
for ( HDDRecorder recorder : recs )\r
{\r
\r
// 選択されたレコーダ\r
String myself = getSelectedRecorderOnToolbar();\r
- HDDRecorderList recs = recorders.getMyself(myself);\r
+ HDDRecorderList recs = recorders.findInstance(myself);\r
\r
for ( HDDRecorder recorder : recs )\r
{\r
jCBX_tunernum.setEnabled(false);\r
\r
// とりあえずIDの一致するものを全部拾う\r
- HDDRecorderList rl = recPlugins.get(recId);\r
+ HDDRecorderList rl = recPlugins.findPlugin(recId);\r
if ( rl.size() <= 0) {\r
MWin.appendError(ERRID+"選択されたプラグインのインスタンスが存在しない: "+recId);\r
return;\r
jLabel_user.setText("インストールディレクトリ");\r
jLabel_wakeup.setText("-");\r
\r
- jTextField_user.setText(rl.get(recId).get(0).getUser());\r
+ jTextField_user.setText(rl.findPlugin(recId).get(0).getUser());\r
jTextField_passwd.setText("dummy");\r
\r
jTextField_ipaddr.setEnabled(false);\r
*/\r
public boolean open(String myself, String rsvId) {\r
\r
- HDDRecorderList recs = recorders.getMyself(myself);\r
+ HDDRecorderList recs = recorders.findInstance(myself);\r
if ( recs.size() == 0 ) {\r
return false; // ここに来たらバグ\r
}\r
// レコーダの初期値の確認\r
myself = getSelectedRecorderOnToolbar(); // ツールバーで選択されているのはどれかな?\r
if ( myself != null && myself.length() > 0 ) {\r
- myrec = recorders.getMyself(myself).get(0); // "すべて"と"ピックアップ"以外\r
+ myrec = recorders.findInstance(myself).get(0); // "すべて"と"ピックアップ"以外\r
}\r
else {\r
myrec = recorders.get(0); // "すべて"と"ピックアップ"なら先頭を選んでおけばいい\r
if ( myself == null ) {\r
return null;\r
}\r
- HDDRecorderList recs = recorders.getMyself(myself);\r
+ HDDRecorderList recs = recorders.findInstance(myself);\r
if ( recs.size() == 0 ) {\r
return null;\r
}\r
if ( myself == null ) {\r
return;\r
}\r
- String myrecId = recorders.getMyself(myself).get(0).getRecorderId();\r
+ String myrecId = recorders.findInstance(myself).get(0).getRecorderId();\r
if ( ! isVARDIA(myrecId) ) {\r
return;\r
}\r
if ( myself == null ) {\r
return;\r
}\r
- String myrecId = recorders.getMyself(myself).get(0).getRecorderId();\r
+ String myrecId = recorders.findInstance(myself).get(0).getRecorderId();\r
if ( ! isVARDIA(myrecId) ) {\r
return;\r
}\r
public void actionPerformed(ActionEvent e) {\r
ProgGenre key_genre = ProgGenre.get((String) jCBXPanel_genre.getSelectedItem());\r
String key_webChName = (String) jComboBox_ch.getSelectedItem();\r
- String recId = recorders.getMyself((String) jComboBox_recorder.getSelectedItem()).get(0).getRecorderId();\r
+ String recId = recorders.findInstance((String) jComboBox_recorder.getSelectedItem()).get(0).getRecorderId();\r
setSelectedAVItems(recId, null, getSelectedAVs(key_genre, key_webChName, recId));\r
MWin.appendMessage(MSGID+"画質・音質等の設定を取得しました");\r
}\r
vals.hide_tvd.progid = vals.hide_content_id;\r
vals.hide_tvd.setContentIdStr();\r
}\r
- HDDRecorderList recs = recorders.getMyself((String) jComboBox_recorder.getSelectedItem());\r
+ HDDRecorderList recs = recorders.findInstance((String) jComboBox_recorder.getSelectedItem());\r
if ( recs.size() > 0 ) {\r
jCBXPanel_pursues.setEnabled(recs.get(0).isPursuesEditable());\r
}\r
import java.util.HashMap;\r
import java.util.Map.Entry;\r
\r
-import javax.swing.AbstractAction;\r
import javax.swing.AbstractCellEditor;\r
import javax.swing.ImageIcon;\r
import javax.swing.JButton;\r
\r
private static final long serialVersionUID = 1L;\r
\r
+ private RowItemList<ReservedItem> rDat;\r
+ \r
@Override\r
public Object getValueAt(int row, int column) {\r
- ReservedItem c = rowView.get(row); \r
+ ReservedItem c = rDat.get(row); \r
if ( c.getColumnCount() > column ) {\r
if ( column == RsvedColumn.DUPMARK.getColumn() ) {\r
return CommonSwingUtils.getColoredString(DUPMARK_COLOR,c.dupmark);\r
\r
@Override\r
public int getRowCount() {\r
- return rowView.size();\r
+ return (rDat!=null) ? rDat.size() : 0; // ↓ のsuper()で呼ばれるのでnullチェックが必要\r
}\r
\r
- public ReservedTableModel(String[] colname, int i) {\r
+ public ReservedItem getRowItem(int row) { return rDat.get(row); }\r
+ \r
+ public ReservedTableModel(String[] colname, int i, RowItemList<ReservedItem> rowdata) {\r
super(colname,i);\r
+ this.rDat = rowdata;\r
}\r
\r
}\r
private DefaultTableModel rowheaderModel_rsved = null;\r
\r
// 表示用のテーブル\r
- private final RowItemList<ReservedItem> rowView = new RowItemList<ReservedItem>();\r
+ private final RowItemList<ReservedItem> rowViewTemp = new RowItemList<ReservedItem>();\r
\r
// テーブルの実体\r
private final RowItemList<ReservedItem> rowData = new RowItemList<ReservedItem>();\r
\r
super();\r
\r
- this.setRowHeaderView(jTable_rowheader = new JTableRowHeader(rowView));\r
+ this.setRowHeaderView(jTable_rowheader = new JTableRowHeader(rowViewTemp));\r
this.setViewportView(getNETable_rsved());\r
\r
Dimension d = new Dimension(jTable_rowheader.getPreferredSize().width,0);\r
*/\r
public void redrawReservedList() {\r
// ★★★ イベントにトリガーされた処理がかちあわないように synchronized() ★★★\r
- synchronized ( rowView ) {\r
+ synchronized ( rowViewTemp ) {\r
_redrawReservedList();\r
}\r
}\r
\r
// 選択されたレコーダ\r
String myself = getSelectedRecorderOnToolbar();\r
- HDDRecorderList recs = recorders.getMyself(myself);\r
+ HDDRecorderList recs = recorders.findInstance(myself);\r
\r
// 現在日時\r
String curDateTime = CommonUtils.getDateTime(0);\r
}\r
\r
// 表示用\r
- rowView.clear();\r
+ rowViewTemp.clear();\r
for ( ReservedItem a : rowData ) {\r
- rowView.add(a);\r
+ rowViewTemp.add(a);\r
}\r
\r
tableModel_rsved.fireTableDataChanged();\r
*/\r
public void redrawListByKeywordFilter(SearchKey keyword, String target) {\r
\r
- rowView.clear();\r
+ rowViewTemp.clear();\r
\r
// 情報を一行ずつチェックする\r
if ( keyword != null ) {\r
boolean isFind = SearchProgram.isMatchKeyword(keyword, "", tvd);\r
\r
if ( isFind ) {\r
- rowView.add(a);\r
+ rowViewTemp.add(a);\r
}\r
}\r
}\r
else {\r
for ( ReservedItem a : rowData ) {\r
- rowView.add(a);\r
+ rowViewTemp.add(a);\r
}\r
}\r
\r
*/\r
private void setOverlapMark() {\r
\r
- if ( rowView.size() < 2 ) {\r
+ if ( rowViewTemp.size() < 2 ) {\r
return;\r
}\r
\r
// 最初の一行はリセットしておかないとなんの処理も行われない場合がある\r
- ReservedItem fr = rowView.get(jTable_rsved.convertRowIndexToModel(0));\r
+ ReservedItem fr = rowViewTemp.get(jTable_rsved.convertRowIndexToModel(0));\r
fr.dupmark = "";\r
fr.fireChanged();\r
\r
int vrow = jTable_rsved.convertRowIndexToModel(i);\r
int vrow2 = jTable_rsved.convertRowIndexToModel(i+1);\r
\r
- ReservedItem ra = rowView.get(vrow);\r
- ReservedItem rb = rowView.get(vrow2);\r
+ ReservedItem ra = rowViewTemp.get(vrow);\r
+ ReservedItem rb = rowViewTemp.get(vrow2);\r
\r
if ( ! sDT2.equals("")) {\r
sDT = sDT2;\r
@Override\r
public void componentShown(ComponentEvent e) {\r
// ★★★ イベントにトリガーされた処理がかちあわないように synchronized() ★★★\r
- synchronized ( rowView ) {\r
+ synchronized ( rowViewTemp ) {\r
// 終了した予約を整理する\r
for (HDDRecorder recorder : recorders) {\r
recorder.refreshReserves();\r
jTable_rsved.getSelectionModel().setSelectionInterval(vrow,vrow);\r
//\r
final int row = jTable_rsved.convertRowIndexToModel(vrow);\r
- ReservedItem ra = rowView.get(row);\r
+ ReservedItem ra = rowViewTemp.get(row);\r
final boolean fexec = ra.exec;\r
final String start = ra.nextstart;\r
final String title = ra.title;\r
@Override\r
public void sorterChanged(RowSorterEvent e) {\r
if ( e.getType() == Type.SORTED ) {\r
- if (rowView.size()>=2) setOverlapMark();\r
+ if (rowViewTemp.size()>=2) setOverlapMark();\r
}\r
}\r
}; \r
}\r
String[] colname = cola.toArray(new String[0]);\r
\r
- tableModel_rsved = new ReservedTableModel(colname, 0);\r
+ tableModel_rsved = new ReservedTableModel(colname, 0, rowViewTemp);\r
jTable_rsved = new JNETableReserved(tableModel_rsved, false);\r
jTable_rsved.setAutoResizeMode(JNETable.AUTO_RESIZE_OFF);\r
\r
}\r
\r
int row = this.convertRowIndexToModel(prow);\r
- ReservedItem c = rowView.get(row);\r
+ ReservedItem c = rowViewTemp.get(row);\r
\r
{\r
// 実行可能かどうか\r
\r
private static final long serialVersionUID = 1L;\r
\r
- private final JButton renderButton = new JButton();\r
- private final JButton editorButton = new JButton();\r
+ private static final String LABEL = ""; // ""にしないとボタンに文字が\r
+ \r
+ private final JButton renderButton;\r
+ private final JButton editorButton;\r
\r
public ButtonColumn() {\r
super();\r
+ renderButton = new JButton(LABEL);\r
renderButton.setMargin(new Insets(1, 0, 0, 0));\r
renderButton.setHorizontalAlignment(JLabel.CENTER);\r
renderButton.setVerticalAlignment(JLabel.CENTER);\r
- editorButton.setAction(act);\r
+ \r
+ editorButton = new JButton(LABEL);\r
+ editorButton.addActionListener(al_toggle);\r
}\r
\r
- private final AbstractAction act = new AbstractAction("") {\r
-\r
- private static final long serialVersionUID = 1L;\r
-\r
+ private final ActionListener al_toggle = new ActionListener() {\r
+ \r
+ @Override\r
public void actionPerformed(ActionEvent e) {\r
fireEditingStopped();\r
\r
int vrow = jTable_rsved.getSelectedRow();\r
int row = jTable_rsved.convertRowIndexToModel(vrow);\r
\r
- ReservedItem c = rowData.get(row);\r
+ ReservedItem c = ((ReservedTableModel) jTable_rsved.getModel()).getRowItem(row);\r
+ \r
if ( doExecOnOff( ! c.exec, c.title, c.chname, c.hide_rsvid, c.recorder) ) {\r
c.exec = ! c.exec;\r
c.fireChanged();\r
import java.io.IOException;\r
import java.net.URI;\r
import java.net.URISyntaxException;\r
+import java.util.ArrayList;\r
import java.util.Calendar;\r
import java.util.GregorianCalendar;\r
import java.util.regex.Matcher;\r
\r
public static String getViewName() { return "ツールバー"; } \r
\r
- public static void setDebug(boolean b) {debug = b; }\r
- private static boolean debug = false;\r
+ public void setDebug(boolean b) {debug = b; }\r
+ private boolean debug = false;\r
\r
/*******************************************************************************\r
* 抽象メソッド\r
private JToggleButton jToggleButton_fullScreen = null;\r
private JButton jButton_update = null;\r
private JButton jButton_help = null;\r
+\r
+ // レコーダ選択イベント発生時にキックするリスナーのリスト\r
+ private final ArrayList<VWHDDRecorderSelectionListener> lsnrs_recsel = new ArrayList<VWHDDRecorderSelectionListener>();\r
\r
// その他\r
\r
*/\r
public String getSelectedRecorder() {\r
if ( jComboBox_select_recorder == null ) {\r
- return null;\r
+ return VWHDDRecorderSelectionListener.SELECTED_ALL;\r
}\r
String recId = (String)jComboBox_select_recorder.getSelectedItem();\r
if ( recId.equals(SELECTED_ALL) ) {\r
- return null;\r
+ return VWHDDRecorderSelectionListener.SELECTED_ALL;\r
}\r
else if ( recId.equals(SELECTED_PICKUP) ) {\r
- return "";\r
+ return VWHDDRecorderSelectionListener.SELECTED_PICKUP;\r
}\r
\r
return recId;\r
*/\r
public void setSelectedRecorder(String myself) {\r
if ( jComboBox_select_recorder != null ) {\r
+ jComboBox_select_recorder.setSelectedItem(null);\r
jComboBox_select_recorder.setSelectedItem((myself == null)?(SELECTED_ALL):(myself));\r
}\r
}\r
jComboBox_select_recorder.addItem(SELECTED_PICKUP);\r
\r
jComboBox_select_recorder.addItemListener(il_recorderSelected);\r
-\r
}\r
\r
/**\r
\r
\r
/*******************************************************************************\r
+ * リスナー追加/削除\r
+ ******************************************************************************/\r
+ \r
+ public void addVWHDDRecorderSelectionListener(VWHDDRecorderSelectionListener l) {\r
+ if ( ! lsnrs_recsel.contains(l) ) {\r
+ lsnrs_recsel.add(l);\r
+ }\r
+ }\r
+\r
+ public void removeVWHDDRecorderSelectionListener(VWHDDRecorderSelectionListener l) {\r
+ lsnrs_recsel.remove(l);\r
+ }\r
+\r
+ /*******************************************************************************\r
* リスナー\r
******************************************************************************/\r
\r
@Override\r
public void itemStateChanged(ItemEvent e) {\r
if (e.getStateChange() == ItemEvent.SELECTED) {\r
+ // 旧ロジック\r
recorderSelectorChanged();\r
+ \r
+ // 新ロジック\r
+ {\r
+ String selected = getSelectedRecorder();\r
+ HDDRecorderList recs = recorders.findInstance(selected);\r
+ \r
+ VWHDDRecorderSelectionEvent ev = new VWHDDRecorderSelectionEvent(e.getSource(),selected,recs);\r
+\r
+ if (debug) System.out.println(DBGID+"recorder selection rised selected="+selected);\r
+\r
+ for ( VWHDDRecorderSelectionListener l : lsnrs_recsel ) {\r
+ l.recorderSelected(ev);\r
+ }\r
+ }\r
}\r
+ \r
}\r
};\r
\r
jComboBox_select_recorder.setMinimumSize(d);\r
//jComboBox_select_recorder.setEnabled(false);\r
\r
- // 初期値\r
+ // 初期値(ItemListenerは↓の中で追加される)\r
updateRecorderComboBox();\r
- \r
- // 選択された\r
- jComboBox_select_recorder.addItemListener(il_recorderSelected);\r
}\r
return(jComboBox_select_recorder);\r
}\r
public ArrayList<ReserveList> getReserves();\r
\r
/**\r
- * 予約一覧を返します。\r
+ * 自動予約一覧を返します。\r
+ */\r
+ public AutoReserveInfoList getAutoReserves();\r
+ \r
+ /**\r
+ * 録画結果一覧を返します。\r
*/\r
public ArrayList<RecordedInfo> getRecorded();\r
\r
* @see #GetRdReserveDetails()\r
*/\r
public boolean isThereAdditionalDetails();\r
+\r
+ /**\r
+ * 自動予約の編集をサポートしているかどうかを返します。\r
+ */\r
+ public boolean isEditAutoReserveSupported();\r
\r
/**\r
* 自動エンコーダ選択を使用するかどうかを返します。\r
public boolean GetRdSettings(boolean force);\r
\r
/**\r
- * <P>レコーダから予約一覧(と各種設定の取得を行います。\r
+ * <P>レコーダから予約一覧(と各種設定)の取得を行います。\r
* <P>将来的には、各種設定の取得は別メソッドにわけたいところ。\r
* @param force : trueの場合レコーダへのアクセスを強制します。falseの場合キャッシュファイルがあればそちらを利用します。\r
* @see #GetRdSettings(boolean)\r
- * @see #GetRdReserveDetails()\r
*/\r
public boolean GetRdReserve(boolean force);\r
+ \r
+ /**\r
+ * <P>レコーダから自動予約一覧の取得を行います。\r
+ * @param force : trueの場合レコーダへのアクセスを強制します。falseの場合キャッシュファイルがあればそちらを利用します。\r
+ * @see #isEditAutoReserveSupported()\r
+ */\r
+ public boolean GetRdAutoReserve(boolean force);\r
\r
/**\r
* <P>レコーダから録画結果一覧の取得を行います。\r
\r
private static final HDDRecorderList mylist = new HDDRecorderList();\r
\r
- /*\r
- // 重複チェックをしておく\r
- @Override\r
- public boolean add(HDDRecorder r) {\r
- if ( this.get(r.getRecorderId()).size() > 0 ) {\r
- System.err.println("[DEBUG] プラグインのレコーダIDが重複しています: "+r.getRecorderId()); // これは余計だった\r
- }\r
- return super.add(r);\r
- }\r
- */\r
- \r
// レコーダIDから種類を調べる\r
public RecType getRecId2Type(String recId) {\r
- ArrayList<HDDRecorder> rl = this.get(recId);\r
+ ArrayList<HDDRecorder> rl = this.findPlugin(recId);\r
if ( rl.size() > 0 ) {\r
return rl.get(0).getType();\r
}\r
/**\r
* レコーダIDに合ったプラグイン(種族)を探す\r
*/\r
- public HDDRecorderList get(String recId) {\r
+ public HDDRecorderList findPlugin(String recId) {\r
if ( recId == null ) {\r
return this;\r
}\r
* @return 本来{@link HDDRecorder}を返すべきだが、呼び出し側の処理を書きやすくするために{@link HDDRecorderList}を返す。よって、==nullではなく.size()==0で確認する。\r
* @param myself 「すべて」を指定する場合はNULLをどうぞ\r
*/\r
- public HDDRecorderList getMyself(String myself) {\r
+ public HDDRecorderList findInstance(String myself) {\r
if (myself == null || myself.length() == 0) {\r
return this;\r
}\r
for ( HDDRecorder rec : this ) {\r
if ( rec.isMyself(myself) ) {\r
mylist.add(rec);\r
+ break;\r
}\r
}\r
return mylist;\r
@Override\r
public boolean isThereAdditionalDetails() { return false; }\r
@Override\r
+ public boolean isEditAutoReserveSupported() { return false; }\r
+ @Override\r
public boolean isRepeatReserveSupported() { return true; }\r
@Override\r
public boolean isPursuesEditable() { return false; }\r
private ArrayList<ReserveList> RESERVES = new ArrayList<ReserveList>();\r
\r
/**\r
+ * 自動予約一覧\r
+ */\r
+ public AutoReserveInfoList getAutoReserves() { return AUTORESERVES; }\r
+ private AutoReserveInfoList AUTORESERVES = new AutoReserveInfoList();\r
+ \r
+ /**\r
* 録画済み一覧\r
*/\r
public ArrayList<RecordedInfo> getRecorded() { return RECORDED; }\r
return entry;\r
}\r
\r
+ /**\r
+ * 自動予約一覧の置き換え\r
+ */\r
+ protected void setAutoReserves(AutoReserveInfoList l) {\r
+ AUTORESERVES = l;\r
+ }\r
+ \r
/*******************************************************************************\r
* ログと進捗ダイアログ\r
******************************************************************************/\r
\r
@Override\r
public RecType getType() {\r
- // TODO Auto-generated method stub\r
return null;\r
}\r
@Override\r
public ChannelCode getChCode() {\r
- // TODO Auto-generated method stub\r
return null;\r
}\r
@Override\r
public boolean ChangeChannel(String Channel) {\r
- // TODO Auto-generated method stub\r
return false;\r
}\r
@Override\r
public boolean GetRdSettings(boolean force) {\r
- // TODO Auto-generated method stub\r
return true;\r
}\r
@Override\r
public boolean GetRdReserve(boolean force) {\r
- // TODO Auto-generated method stub\r
+ return true;\r
+ }\r
+ @Override\r
+ public boolean GetRdAutoReserve(boolean force) {\r
return true;\r
}\r
@Deprecated\r
@Override\r
public boolean GetRdReserveDetails() {\r
- // TODO Auto-generated method stub\r
return false;\r
}\r
@Override\r
public boolean GetRdRecorded(boolean force) {\r
- // TODO Auto-generated method stub\r
return true;\r
}\r
@Override\r
public boolean PostRdEntry(ReserveList r) {\r
- // TODO Auto-generated method stub\r
return false;\r
}\r
@Override\r
public boolean UpdateRdEntry(ReserveList o, ReserveList r) {\r
- // TODO Auto-generated method stub\r
return false;\r
}\r
@Override\r
public ReserveList RemoveRdEntry(String delno) {\r
- // TODO Auto-generated method stub\r
return null;\r
}\r
@Override\r
public String getErrmsg() {\r
- // TODO Auto-generated method stub\r
return null;\r
}\r
}\r
image = new BufferedImage(imgw, imgh, BufferedImage.TYPE_INT_ARGB);\r
Graphics2D g2 = (Graphics2D)image.createGraphics();\r
\r
- g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,aahint);\r
+ g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,aahint); // アンチエイリアスの設定\r
+ g2.setRenderingHint(RenderingHints.KEY_RENDERING,RenderingHints.VALUE_RENDER_SPEED);\r
g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0f));\r
\r
float baseline = 0.0F;\r
}\r
\r
private static final String thisEncoding = "MS932";\r
+ private static final String xmlEncoding = "utf8";\r
\r
/*******************************************************************************\r
* 種族の特性\r
@Override\r
public RecType getType() { return RecType.RECORDER; }\r
\r
+ // 自動予約を編集できる\r
+ @Override\r
+ public boolean isEditAutoReserveSupported() { return true; }\r
// 自動エンコーダ選択は禁止\r
@Override\r
public boolean isAutoEncSelectEnabled() { return false; }\r
return (getListTunerID().size()>0 && getListChValue().size()>0 && getListPresetID().size()>0);\r
}\r
\r
- /*\r
+ /**\r
* レコーダーから予約一覧を取得する \r
*/\r
- \r
@Override\r
public boolean GetRdReserve(boolean force)\r
{\r
}\r
\r
/**\r
+ * レコーダーから自動予約一覧を取得する \r
+ */\r
+ @Override\r
+ public boolean GetRdAutoReserve(boolean force)\r
+ {\r
+ System.out.println("レコーダから自動予約一覧を取得します("+force+")");\r
+ \r
+ errmsg = "";\r
+ \r
+ // おまじない\r
+ Authenticator.setDefault(new MyAuthenticator(getUser(), getPasswd()));\r
+ \r
+ AutoReserveInfoList newAutoReserveList = new AutoReserveInfoList();\r
+ if ( ! GetRdAutoReserveList(newAutoReserveList) ) {\r
+ return false;\r
+ }\r
+ \r
+ setAutoReserves(newAutoReserveList);\r
+ \r
+ return true;\r
+ }\r
+ \r
+ /**\r
+ * レコーダーから録画結果一覧を取得する \r
* @see #GetRdSettings(boolean)\r
*/\r
@Override\r
String response="";\r
{\r
reportProgress("予約一覧を取得します.");\r
- String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/api/EnumReserveInfo",null,"utf8");\r
+ String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/api/EnumReserveInfo",null,xmlEncoding);\r
response = d[1];\r
\r
if (response == null) {\r
return null;\r
}\r
\r
+ \r
/**\r
- * 録画結果一覧を取得する\r
+ * 自動予約一覧を取得する\r
*/\r
+ private boolean GetRdAutoReserveList(AutoReserveInfoList newAutoReserveList) {\r
+ \r
+ int maxpage = 1;\r
+ String firstResp = null; // 2回呼びたくない\r
+ \r
+ String url = "http://"+getIPAddr()+":"+getPortNo()+"/autoaddepg.html&page=";\r
+ \r
+ {\r
+ reportProgress("自動予約一覧のページ数を取得します.");\r
+ String[] d = reqGET(url+"0",null);\r
+ if (d[1] == null) {\r
+ errmsg = "レコーダーが反応しません";\r
+ return false;\r
+ }\r
+ \r
+ firstResp = d[1];\r
+ \r
+ // maxpageの計算が入る\r
+ Matcher ma = Pattern.compile("\"autoaddepg\\.html\\?page=\"").matcher(firstResp);\r
+ while ( ma.find() ) {\r
+ ++maxpage;\r
+ }\r
+ }\r
+ \r
+ for ( int i=1; i<=maxpage; i++ ) {\r
+ \r
+ reportProgress(String.format("+自動予約一覧を取得します(%d/%d)",i,maxpage));\r
+ \r
+ String response;\r
+ if ( i == 1 ) {\r
+ response = firstResp;\r
+ }\r
+ else {\r
+ // あとで\r
+ String[] d = reqGET(url+String.valueOf(i),null);\r
+ if (d[1] == null) {\r
+ errmsg = "レコーダーが反応しません";\r
+ return false;\r
+ }\r
+ \r
+ response = d[1];\r
+ }\r
+ \r
+ Matcher ma = Pattern.compile("<TR>(.+?)</TR>",Pattern.DOTALL).matcher(response);\r
+ while ( ma.find() ) {\r
+ // 入れ物用意\r
+ AutoReserveInfo c = new AutoReserveInfo();\r
+ \r
+ // 分解\r
+ Matcher mb = Pattern.compile("<TD>(.*?)</TD>",Pattern.DOTALL).matcher(ma.group(1));\r
+ for ( int n=0; mb.find(); n++ ) {\r
+ switch (n) {\r
+ case 0: // title\r
+ c.setLabel(CommonUtils.unEscape(mb.group(1)));\r
+ break;\r
+ case 5: // id\r
+ Matcher mc = Pattern.compile("\"autoaddepginfo\\.html\\?id=(.+)\"",Pattern.DOTALL).matcher(mb.group(1));\r
+ if ( mc.find() ) {\r
+ c.setId(mc.group(1));\r
+ }\r
+ break;\r
+ case 3: // channel\r
+ c.getChannels().add(CommonUtils.unEscape(mb.group(1)));\r
+ break;\r
+ case 1: // mark\r
+ case 2: // genre\r
+ case 4: // service\r
+ default:\r
+ break;\r
+ }\r
+ }\r
+ if ( c.getId() == null ) {\r
+ c = null;\r
+ continue; // 情報がみつからなかった\r
+ }\r
+ \r
+ newAutoReserveList.add(c);\r
+ }\r
+ }\r
+ \r
+ return true;\r
+ }\r
\r
+ /**\r
+ * 録画結果一覧を取得する\r
+ */\r
private boolean GetRdRecordedList(ArrayList<RecordedInfo> newRecordedList) {\r
\r
String critDate = null;\r
public static final String csCode = "cs";\r
\r
// タイトルの頭の邪魔な文字\r
- public static final String titlePrefixRemoveExpr = "^(\\[(新|無|字|終|HV|無料)\\]|無料≫|【無料】)+\\s*"; \r
+ public static final String titlePrefixRemoveExpr = "^(\\[(新|無|字|終|HV|SS|無料)\\]|無料≫|【無料】)+\\s*"; \r
public static final String epnoNormalizeExpr = "([第#(])(\\d\\D|\\d$)";\r
\r
// 種族の特性\r
PAPER ("新聞形式"),\r
RSVED ("本体予約一覧"),\r
RECED ("録画結果一覧"),\r
+ AUTORES ("自動予約一覧"),\r
SETTING ("各種設定"),\r
RECSET ("レコーダ設定"),\r
CHSET ("CH設定"),\r
\r
\r
public class VersionInfo {\r
- private static final String Version = "タイニー番組ナビゲータ 3.22.1β";\r
+ private static final String Version = "タイニー番組ナビゲータ 3.22.2β";\r
\r
private static final String OSname = System.getProperty("os.name");\r
private static final String OSvers = System.getProperty("os.version");\r
private VWPaperView paper = null;\r
private VWReserveListView reserved = null;\r
private VWRecordedListView recorded = null;\r
+ private VWAutoReserveListView autores = null;\r
private VWSettingView setting = null;\r
private VWRecorderSettingView recsetting = null;\r
private VWChannelSettingView chsetting = null;\r
}\r
\r
\r
- \r
/**\r
* \r
* 録画結果一覧の内部クラス\r
@Override\r
protected String getSelectedRecorderOnToolbar() { return toolBar.getSelectedRecorder(); }\r
}\r
+ \r
+ \r
+ /**\r
+ * \r
+ * 録画結果一覧の内部クラス\r
+ * \r
+ */\r
+ private class VWAutoReserveListView extends AbsAutoReserveListView {\r
\r
+ private static final long serialVersionUID = 1L;\r
+\r
+ // 環境設定の入れ物を渡す\r
+ @Override\r
+ protected Env getEnv() { return env; }\r
+ @Override\r
+ protected Bounds getBoundsEnv() { return bounds; }\r
+ \r
+ }\r
\r
/***\r
* 各種設定の内部クラス\r
CommonUtils.setDebug(env.getDebug());\r
\r
SwingBackgroundWorker.setDebug(env.getDebug());\r
- \r
+\r
+ // ほにゃらら\r
+ toolBar.setDebug(env.getDebug());\r
+ autores.setDebug(env.getDebug());\r
+\r
// PassedProgramListの設定変更\r
tvprograms.getPassed().setPassedDir(env.getPassedDir());\r
\r
\r
HDDRecorderList recs;\r
if ( myself != null ) {\r
- recs = recorders.getMyself(myself);\r
+ recs = recorders.findInstance(myself);\r
}\r
else {\r
recs = recorders;\r
}\r
}\r
\r
+ // 自動予約一覧の取得\r
+ if ( recorder.isEditAutoReserveSupported() ) {\r
+ if ( ! recorder.GetRdAutoReserve(force) ) {\r
+ // 取得に失敗\r
+ mwin.appendError(recorder.getErrmsg()+" "+recorder.getIPAddr()+":"+recorder.getPortNo()+":"+recorder.getRecorderId());\r
+ ringBeep();\r
+ return false;\r
+ }\r
+ }\r
+ \r
// 録画結果一覧の取得\r
if ( env.getSkipGetRdRecorded() ) {\r
mwin.appendMessage("【!】録画結果一覧の取得はスキップされました");\r
\r
HDDRecorderList recs;\r
if ( myself != null ) {\r
- recs = recorders.getMyself(myself);\r
+ recs = recorders.findInstance(myself);\r
}\r
else {\r
recs = recorders;\r
//\r
recorders.clear();\r
for ( RecorderInfo ri : recInfoList ) {\r
- ArrayList<HDDRecorder> rl = recPlugins.get(ri.getRecorderId());\r
+ ArrayList<HDDRecorder> rl = recPlugins.findPlugin(ri.getRecorderId());\r
if ( rl.size() == 0 ) {\r
stwin.appendError("【レコーダプラグイン】プラグインがみつかりません: "+ri.getRecorderId()+"("+ri.getRecorderIPAddr()+":"+ri.getRecorderPortNo()+")");\r
}\r
mainWindow.addTab(paper, MWinTab.PAPER);\r
mainWindow.addTab(reserved, MWinTab.RSVED);\r
mainWindow.addTab(recorded, MWinTab.RECED);\r
+ mainWindow.addTab(autores, MWinTab.AUTORES);\r
mainWindow.addTab(setting, MWinTab.SETTING);\r
mainWindow.addTab(recsetting, MWinTab.RECSET);\r
mainWindow.addTab(chsetting, MWinTab.CHSET);\r
// 開いていたタブ\r
mainWindow.setShowSettingTabs(bounds.getShowSettingTabs());\r
\r
- // 選択していたレコーダ\r
- toolBar.setSelectedRecorder(bounds.getSelectedRecorderId());\r
- \r
// ステータスエリアの高さ\r
mwin.setRows(bounds.getStatusRows());\r
\r
paper = new VWPaperView();\r
reserved = new VWReserveListView();\r
recorded = new VWRecordedListView();\r
+ autores = new VWAutoReserveListView();\r
setting = new VWSettingView();\r
recsetting = new VWRecorderSettingView();\r
chsetting = new VWChannelSettingView();\r
chsortsetting = new VWChannelSortView();\r
chconvsetting = new VWChannelConvertView();\r
\r
+ // 設定のほにゃらら\r
+ toolBar.setDebug(env.getDebug());\r
+ autores.setDebug(env.getDebug());\r
+\r
// ページャーの設定\r
toolBar.setPagerItems();\r
\r
JOptionPane.showMessageDialog(cp, "レコーダが登録されていません。\n最初に登録を行ってください。\n番組表だけを使いたい場合は、\nNULLプラグインを登録してください。");\r
}\r
\r
- // メインウィンドウを入れ替える\r
+ // メインウィンドウをスプラッシュからコンポーネントに入れ替える\r
this.setVisible(false);\r
this.setContentPane(mainWindow);\r
setInitBounds();\r
// タイトル更新\r
setTitleBar();\r
\r
+ // [ツールバー/レコーダ選択] 自動予約一覧\r
+ toolBar.addVWHDDRecorderSelectionListener(autores);\r
+ \r
+ // レコーダ選択イベントキック\r
+ toolBar.setSelectedRecorder(bounds.getSelectedRecorderId());\r
+ \r
// [タイマー] タイトルバー更新/リスト形式の現在時刻ノード/新聞形式の現在時刻ノード\r
timer_now.addVWTimerRiseListener(this);\r
timer_now.addVWTimerRiseListener(listed);\r