3 import java.awt.BorderLayout;
\r
4 import java.awt.Color;
\r
5 import java.awt.Component;
\r
6 import java.awt.Dimension;
\r
7 import java.awt.event.ActionEvent;
\r
8 import java.util.ArrayList;
\r
9 import java.util.HashMap;
\r
11 import javax.swing.ImageIcon;
\r
12 import javax.swing.JPanel;
\r
13 import javax.swing.JScrollPane;
\r
14 import javax.swing.JTable;
\r
15 import javax.swing.table.DefaultTableColumnModel;
\r
16 import javax.swing.table.DefaultTableModel;
\r
17 import javax.swing.table.TableCellRenderer;
\r
18 import javax.swing.table.TableColumn;
\r
19 import javax.swing.table.TableModel;
\r
26 public abstract class AbsAutoReserveListView extends JPanel implements HDDRecorderListener {
\r
28 private static final long serialVersionUID = 1L;
\r
30 public void setDebug(boolean b) {debug = b; }
\r
31 private boolean debug = false;
\r
34 /*******************************************************************************
\r
36 ******************************************************************************/
\r
38 protected abstract Env getEnv();
\r
39 protected abstract Bounds getBoundsEnv();
\r
42 /*******************************************************************************
\r
44 ******************************************************************************/
\r
46 private static final String MSGID = "[自動予約一覧] ";
\r
47 private static final String ERRID = "[ERROR]"+MSGID;
\r
48 private static final String DBGID = "[DEBUG]"+MSGID;
\r
50 private static final String ICONFILE_EXEC = "icon/media-record-3.png";
\r
52 /*******************************************************************************
\r
54 ******************************************************************************/
\r
57 private final Env env = getEnv();
\r
58 private final Bounds bounds = getBoundsEnv();
\r
60 private final ImageIcon execicon = new ImageIcon(ICONFILE_EXEC);
\r
66 public static HashMap<String,Integer> getColumnIniWidthMap() {
\r
67 if (rcmap.size() == 0 ) {
\r
68 for ( AutoRsvColumn rc : AutoRsvColumn.values() ) {
\r
69 rcmap.put(rc.toString(),rc.getIniWidth()); // toString()!
\r
75 private static final HashMap<String,Integer> rcmap = new HashMap<String, Integer>();
\r
77 public static enum AutoRsvColumn {
\r
79 TITLE ("タイトル", 500),
\r
80 CHNAME ("チャンネル名", 150),
\r
83 private String name;
\r
84 private int iniWidth;
\r
86 private AutoRsvColumn(String name, int iniWidth) {
\r
88 this.iniWidth = iniWidth;
\r
91 public String getName() {
\r
95 public int getIniWidth() {
\r
99 public int getColumn() {
\r
103 public static AutoRsvColumn getColumnValue(int column) {
\r
104 if ( column >= AutoRsvColumn.values().length ) {
\r
107 return (AutoRsvColumn.values())[column];
\r
112 /*******************************************************************************
\r
114 ******************************************************************************/
\r
117 private class AutoRsvItem extends RowItem implements Cloneable {
\r
119 AutoReserveInfo autorsv;
\r
122 protected void myrefresh(RowItem o) {
\r
123 AutoRsvItem c = (AutoRsvItem) o;
\r
125 c.addData(c.autorsv.getExec());
\r
126 c.addData(c.autorsv.getLabel());
\r
127 c.addData(c.autorsv.getChName());
\r
130 public AutoRsvItem clone() {
\r
131 return (AutoRsvItem) super.clone();
\r
136 // ソートが必要な場合はTableModelを作る。ただし、その場合Viewのrowがわからないので行の入れ替えが行えない
\r
137 private class AutoRsvTableModel extends DefaultTableModel {
\r
139 private static final long serialVersionUID = 1L;
\r
141 private RowItemList<AutoRsvItem> rDat;
\r
144 public Object getValueAt(int row, int column) {
\r
145 AutoRsvItem c = rDat.get(row);
\r
146 if ( c.getColumnCount() > column ) {
\r
147 return c.get(column);
\r
153 public void setValueAt(Object aValue, int row, int column) {
\r
158 public int getRowCount() {
\r
159 return (rDat!=null) ? rDat.size() : 0; // ↓ のsuper()で呼ばれるのでnullチェックが必要
\r
162 public AutoRsvTableModel(String[] colname, int i, RowItemList<AutoRsvItem> rowdata) {
\r
164 this.rDat = rowdata;
\r
169 private JScrollPane jsc_list = null;
\r
170 private JNETable jt_list = null;
\r
171 private JTable jt_rowheader = null;
\r
172 private DefaultTableModel tableModel_list = null;
\r
173 private DefaultTableModel rowheaderModel_list = null;
\r
176 private JScrollPane jsc_detail = null;
\r
177 private JTextAreaWithPopup jta_detail = null;
\r
180 private final RowItemList<AutoRsvItem> rowData = new RowItemList<AutoRsvItem>();
\r
183 private final RowItemList<AutoRsvItem> rowViewTemp = new RowItemList<AutoRsvItem>();
\r
186 /*******************************************************************************
\r
188 ******************************************************************************/
\r
190 public AbsAutoReserveListView() {
\r
194 this.setLayout(new BorderLayout());
\r
195 this.add(getJScrollPane_list(), BorderLayout.CENTER);
\r
196 this.add(getJTextPane_detail(), BorderLayout.PAGE_END);
\r
201 /*******************************************************************************
\r
203 ******************************************************************************/
\r
206 * テーブルの行番号の表示のON/OFF
\r
208 public void setRowHeaderVisible(boolean b) {
\r
209 jsc_list.getRowHeader().setVisible(b);
\r
215 private void redrawByRecorderSelected() {
\r
219 rowViewTemp.clear();
\r
220 for ( HDDRecorder rec : getSelectedRecorderList() ) {
\r
221 for ( AutoReserveInfo info : rec.getAutoReserves() ) {
\r
222 AutoRsvItem c = new AutoRsvItem();
\r
226 rowViewTemp.add(c);
\r
231 tableModel_list.fireTableDataChanged();
\r
232 rowheaderModel_list.fireTableDataChanged();
\r
236 /*******************************************************************************
\r
238 ******************************************************************************/
\r
241 * ツールバーでレコーダの選択イベントが発生
\r
244 public void valueChanged(HDDRecorderSelectionEvent e) {
\r
245 if (debug) System.out.println(DBGID+"recorder selection rised");
\r
248 src_recsel = (HDDRecorderSelectable) e.getSource();
\r
251 redrawByRecorderSelected();
\r
254 private String getSelectedRecorderId() {
\r
255 return ( src_recsel!=null ? src_recsel.getSelectedId() : null );
\r
258 private HDDRecorderList getSelectedRecorderList() {
\r
259 return ( src_recsel!=null ? src_recsel.getSelectedList() : null );
\r
262 private HDDRecorderSelectable src_recsel;
\r
269 public void stateChanged(HDDRecorderChangeEvent e) {
\r
271 redrawByRecorderSelected();
\r
274 /*******************************************************************************
\r
276 ******************************************************************************/
\r
279 /*******************************************************************************
\r
281 ******************************************************************************/
\r
286 private JScrollPane getJScrollPane_list() {
\r
288 if ( jsc_list == null ) {
\r
289 jsc_list = new JScrollPane();
\r
291 jsc_list.setRowHeaderView(jt_rowheader = new JTableRowHeader(rowViewTemp));
\r
292 jsc_list.setViewportView(getNETable_list());
\r
294 Dimension d = new Dimension(jt_rowheader.getPreferredSize().width,0);
\r
295 jsc_list.getRowHeader().setPreferredSize(d);
\r
297 this.setRowHeaderVisible(env.getRowHeaderVisible());
\r
303 private JNETable getNETable_list() {
\r
304 if (jt_list == null) {
\r
306 ArrayList<String> cola = new ArrayList<String>();
\r
307 for ( AutoRsvColumn rc : AutoRsvColumn.values() ) {
\r
308 if ( rc.getIniWidth() >= 0 ) {
\r
309 cola.add(rc.getName());
\r
312 String[] colname = cola.toArray(new String[0]);
\r
314 tableModel_list = new AutoRsvTableModel(colname, 0, rowViewTemp);
\r
315 jt_list = new JNETableAutoReserve(tableModel_list, false);
\r
316 jt_list.setAutoResizeMode(JNETable.AUTO_RESIZE_OFF);
\r
319 rowheaderModel_list = (DefaultTableModel) jt_rowheader.getModel();
\r
321 /* - ソートはいらない気がする -
\r
324 TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(tableModel_list);
\r
325 jt_list.setRowSorter(sorter);
\r
327 // 数値でソートする項目用の計算式(番組長とか)
\r
328 final Comparator<String> titlecomp = new Comparator<String>() {
\r
331 public int compare(String o1, String o2) {
\r
332 String t1 = TraceProgram.replacePop(o1.replaceAll(TVProgram.titlePrefixRemoveExpr, "")).replaceFirst(TVProgram.epnoNormalizeExpr, "$1\\0$2");
\r
333 String t2 = TraceProgram.replacePop(o2.replaceAll(TVProgram.titlePrefixRemoveExpr, "")).replaceFirst(TVProgram.epnoNormalizeExpr, "$1\\0$2");
\r
334 return t1.compareTo(t2);
\r
338 // ソーターの効かない項目用の計算式(重複マーク)
\r
339 final Comparator<String> noncomp = new Comparator<String>() {
\r
341 public int compare(String o1, String o2) {
\r
346 sorter.setComparator(jt_list.getColumn(AutoResColumn.TITLE.getName()).getModelIndex(),titlecomp);
\r
347 sorter.setComparator(jt_list.getColumn(AutoResColumn.END.getName()).getModelIndex(),noncomp);
\r
352 DefaultTableColumnModel columnModel = (DefaultTableColumnModel)jt_list.getColumnModel();
\r
353 TableColumn column = null;
\r
354 for ( AutoRsvColumn rc : AutoRsvColumn.values() ) {
\r
355 if ( rc.getIniWidth() < 0 ) {
\r
358 column = columnModel.getColumn(rc.ordinal());
\r
359 //column.setPreferredWidth(bounds.getRecordedColumnSize().get(rc.toString()));
\r
360 column.setPreferredWidth(rc.getIniWidth());
\r
364 ButtonColumn buttonColumn = new ButtonColumn(execicon);
\r
365 jt_list.getColumn(AutoRsvColumn.EXEC.getName()).setCellRenderer(buttonColumn);
\r
366 jt_list.getColumn(AutoRsvColumn.EXEC.getName()).setCellEditor(buttonColumn);
\r
367 jt_list.getColumn(AutoRsvColumn.EXEC.getName()).setResizable(false);
\r
370 //jt_list.getSelectionModel().addListSelectionListener(lsSelectListner);
\r
378 private JScrollPane getJTextPane_detail() {
\r
379 if ( jsc_detail == null ) {
\r
380 jsc_detail = new JScrollPane(jta_detail = new JTextAreaWithPopup(),JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
\r
381 jta_detail.setRows(8);
\r
382 jta_detail.setEditable(false);
\r
383 jta_detail.setBackground(Color.LIGHT_GRAY);
\r
388 /*******************************************************************************
\r
390 ******************************************************************************/
\r
392 private class JNETableAutoReserve extends JNETable {
\r
394 private static final long serialVersionUID = 1L;
\r
396 public void setDisabledColor(Color c) { disabledColor = c; }
\r
397 private Color disabledColor = new Color(180,180,180);
\r
399 private int prechkrow = -1;
\r
400 private boolean prechkdisabled = false;
\r
403 public Component prepareRenderer(TableCellRenderer tcr, int row, int column) {
\r
404 Component c = super.prepareRenderer(tcr, row, column);
\r
405 Color bgColor = null;
\r
406 if(isRowSelected(row)) {
\r
407 bgColor = this.getSelectionBackground();
\r
411 if ( prechkdisabled ) {
\r
412 bgColor = disabledColor;
\r
415 bgColor = (isSepRowColor && row%2 == 1)?(evenColor):(super.getBackground());
\r
418 c.setBackground(bgColor);
\r
422 // 連続して同じ行へのアクセスがあったら計算を行わず前回のままにする
\r
423 private boolean isRowPassed(int prow) {
\r
425 if(prechkrow == prow) {
\r
426 return prechkdisabled;
\r
429 int row = this.convertRowIndexToModel(prow);
\r
430 AutoRsvItem c = rowViewTemp.get(row);
\r
435 prechkdisabled = ! c.autorsv.getExec();
\r
442 public boolean isCellEditable(int row, int column) {
\r
443 if ( column == AutoRsvColumn.EXEC.getColumn() ) {
\r
451 public JNETableAutoReserve(boolean b) {
\r
454 public JNETableAutoReserve(TableModel d, boolean b) {
\r
463 private class ButtonColumn extends AbstractExecButtonColumn {
\r
465 private static final long serialVersionUID = 1L;
\r
467 public ButtonColumn(ImageIcon icon) {
\r
472 protected void toggleAction(ActionEvent e) {
\r
474 fireEditingStopped();
\r
476 int vrow = jt_list.getSelectedRow();
\r
477 int row = jt_list.convertRowIndexToModel(vrow);
\r
479 AutoRsvItem c = rowViewTemp.get(row);
\r
481 //if ( doExecOnOff( ! c.exec, c.title, c.chname, c.hide_rsvid, c.recorder) )
\r
483 c.autorsv.setExec( ! c.autorsv.getExec());
\r
487 jt_list.clearSelection();
\r
488 jt_list.setRowSelectionInterval(vrow, vrow);
\r