OSDN Git Service

りもこんでRDが選択できなくなった!
[tainavi/TinyBannavi.git] / TinyBannavi / src / remoteCtrl / Viewer.java
1 \r
2 package remoteCtrl;\r
3 \r
4 import javax.imageio.ImageIO;\r
5 import javax.swing.SwingUtilities;\r
6 import java.awt.BorderLayout;\r
7 import java.awt.Color;\r
8 import java.awt.Component;\r
9 import java.awt.Dimension;\r
10 import java.awt.Font;\r
11 import java.awt.Image;\r
12 import java.awt.Point;\r
13 import java.awt.Rectangle;\r
14 import java.awt.event.ActionEvent;\r
15 import java.awt.event.ActionListener;\r
16 import java.awt.event.ComponentEvent;\r
17 import java.awt.event.ComponentListener;\r
18 import java.awt.event.KeyAdapter;\r
19 import java.awt.event.KeyEvent;\r
20 import java.awt.event.MouseAdapter;\r
21 import java.awt.event.MouseEvent;\r
22 import java.awt.event.MouseListener;\r
23 import java.awt.event.WindowEvent;\r
24 import java.awt.event.WindowListener;\r
25 import java.io.BufferedReader;\r
26 import java.io.BufferedWriter;\r
27 import java.io.File;\r
28 import java.io.FileReader;\r
29 import java.io.FileWriter;\r
30 import java.io.IOException;\r
31 import java.net.Authenticator;\r
32 import java.util.ArrayList;\r
33 import java.util.regex.Matcher;\r
34 import java.util.regex.Pattern;\r
35 \r
36 import javax.swing.ActionMap;\r
37 import javax.swing.DefaultCellEditor;\r
38 import javax.swing.DefaultComboBoxModel;\r
39 import javax.swing.JButton;\r
40 import javax.swing.JPanel;\r
41 import javax.swing.JFrame;\r
42 import javax.swing.JScrollPane;\r
43 import javax.swing.JTabbedPane;\r
44 import javax.swing.JTable;\r
45 import javax.swing.SpringLayout;\r
46 import javax.swing.UIDefaults;\r
47 import javax.swing.UIManager;\r
48 import javax.swing.plaf.FontUIResource;\r
49 import javax.swing.table.AbstractTableModel;\r
50 import javax.swing.table.DefaultTableColumnModel;\r
51 import javax.swing.table.DefaultTableModel;\r
52 import javax.swing.table.TableCellRenderer;\r
53 import javax.swing.table.TableColumn;\r
54 import javax.swing.JComboBox;\r
55 \r
56 import javax.swing.JLabel;\r
57 \r
58 import tainavi.CommonSwingUtils;\r
59 import tainavi.CommonUtils;\r
60 import tainavi.RecorderInfo;\r
61 import tainavi.RecorderInfoList;\r
62 import tainavi.VWColorCellRenderer;\r
63 import tainavi.VWColorChooserDialog;\r
64 \r
65 public class Viewer extends JFrame {\r
66 \r
67         private static final long serialVersionUID = 1L;\r
68         \r
69         private JTabbedPane jTabbedPane = null;\r
70         \r
71         private JPanel jContentPane = null;\r
72         private JComboBox jComboBox = null;\r
73         private JPanel jPanel = null;\r
74         private JLabel jLabel = null;\r
75         \r
76         private SpringLayout layout = null;\r
77     private final int wBK = 100;\r
78     private final int hBK = 30;\r
79         \r
80         private JPanel jSettingPane = null;\r
81         private JScrollPane jScrollPane = null;\r
82         private JTable jTable = null;\r
83         private JButton jButton = null;\r
84         \r
85         private VWColorChooserDialog ccwin = null;\r
86 \r
87         private final String defFile = "env/RemoteCtrlIni.def";\r
88         private final String defFileBK = "env/RemoteCtrl.def";\r
89         \r
90         final private ArrayList<BKSet> bkset = new ArrayList<BKSet>();\r
91         final private ArrayList<String[]> rowData = new ArrayList<String[]>();\r
92         \r
93         private RecorderInfo recinfo = null;\r
94         \r
95         /**\r
96          * 鯛ナビのレコーダ一覧の中で"RD-"を含むもののみ抽出したリスト. \r
97          */\r
98         private RecorderInfoList recorderList = new RecorderInfoList();\r
99         \r
100         final int maxCol = 5;\r
101         final int maxRow = 20;\r
102 \r
103         final String[][] keydefs = {\r
104                         {"08","BACK SPACE"},\r
105                         {"0A","ENTER"},\r
106                         {"10","SHIFT"},\r
107                         {"11","CTRL"},\r
108                         {"12","ALT"},\r
109                         {"13","PAUSE"},\r
110                         {"1B","ESC"},\r
111                         {"20","SPCAE"},\r
112                         {"21","PAGE UP"},\r
113                         {"22","PAGE DOWN"},\r
114                         {"23","END"},\r
115                         {"24","HOME"},\r
116                         {"25","左"},\r
117                         {"26","上"},\r
118                         {"27","右"},\r
119                         {"28","下"},\r
120                         {"2C",","},\r
121                         {"2D","-"},\r
122                         {"2E","."},\r
123                         {"2F","/"},\r
124                         {"30","0"},\r
125                         {"31","1"},\r
126                         {"32","2"},\r
127                         {"33","3"},\r
128                         {"34","4"},\r
129                         {"35","5"},\r
130                         {"36","6"},\r
131                         {"37","7"},\r
132                         {"38","8"},\r
133                         {"39","9"},\r
134                         {"3B",";"},\r
135                         {"3D","="},\r
136                         {"41","A"},\r
137                         {"42","B"},\r
138                         {"43","C"},\r
139                         {"44","D"},\r
140                         {"45","E"},\r
141                         {"46","F"},\r
142                         {"47","G"},\r
143                         {"48","H"},\r
144                         {"49","I"},\r
145                         {"4A","J"},\r
146                         {"4B","K"},\r
147                         {"4C","L"},\r
148                         {"4D","M"},\r
149                         {"4E","N"},\r
150                         {"4F","O"},\r
151                         {"50","P"},\r
152                         {"51","Q"},\r
153                         {"52","R"},\r
154                         {"53","S"},\r
155                         {"54","T"},\r
156                         {"55","U"},\r
157                         {"56","V"},\r
158                         {"57","W"},\r
159                         {"58","X"},\r
160                         {"59","Y"},\r
161                         {"5A","Z"},\r
162                         {"5B","["},\r
163                         {"5C","\\"},\r
164                         {"5D","]"},\r
165                         {"70","F1"},\r
166                         {"71","F2"},\r
167                         {"72","F3"},\r
168                         {"73","F4"},\r
169                         {"74","F5"},\r
170                         {"75","F6"},\r
171                         {"76","F7"},\r
172                         {"77","F8"},\r
173                         {"78","F9"},\r
174                         {"79","F10"},\r
175                         {"7A","F11"},\r
176                         {"7B","F12"},\r
177                         {"7F","DELETE"},\r
178                         {"9B","INS"},\r
179                         {"C0","`"},\r
180                         {"DE","'"},\r
181         };\r
182         \r
183         final String[] codedefs = {\r
184                         "00(11)",\r
185                         "01(1)",\r
186                         "02(2)",\r
187                         "03(3)",\r
188                         "04(4)",\r
189                         "05(5)",\r
190                         "06(6)",\r
191                         "07(7)",\r
192                         "08(8)",\r
193                         "09(9)",\r
194                         "0A",\r
195                         "0B",\r
196                         "0C(12)",\r
197                         "0D(10)",\r
198                         "0E(サーチ/文字)",\r
199                         "0F(入力切替)",\r
200                         "10",\r
201                         "11(トレイ開閉)",\r
202                         "12(電源切)",\r
203                         "13(再生)",\r
204                         "14",\r
205                         "15(録画)",\r
206                         "16(停止)",\r
207                         "17(一時停止)",\r
208                         "18(DVD/USB)",\r
209                         "19(HDD)",\r
210                         "1A(タイムスリップ)",\r
211                         "1B",\r
212                         "1C",\r
213                         "1D",\r
214                         "1E(CH上)",\r
215                         "1F(CH下)",\r
216                         "20",\r
217                         "21(放送切替)",\r
218                         "22(メディア)",\r
219                         "23(d データ)",\r
220                         "24(入力1スルー)",\r
221                         "25(CH番号入力",\r
222                         "26",\r
223                         "27",\r
224                         "28",\r
225                         "29(青)",\r
226                         "2A(赤)",\r
227                         "2B(緑)",\r
228                         "2C(黄)",\r
229                         "2D",\r
230                         "2E(ごみ箱へ)",\r
231                         "2F",\r
232                         "30",\r
233                         "31",\r
234                         "32",\r
235                         "33",\r
236                         "34",\r
237                         "35",\r
238                         "36",\r
239                         "37(iLINK)",\r
240                         "38(アングル)",\r
241                         "39(字幕)",\r
242                         "3A(タイムバー)",\r
243                         "3B(おまかせ)",\r
244                         "3C",\r
245                         "3D",\r
246                         "3E",\r
247                         "3F",\r
248                         "40(録画予約一覧)",\r
249                         "41(編集ナビ)",\r
250                         "42(見るナビ)",\r
251                         "43(見ながら)",\r
252                         "44(決定)",\r
253                         "45(クイックメニュー)",\r
254                         "46(スタートメニュー)",\r
255                         "47",\r
256                         "48",\r
257                         "49",\r
258                         "4A(モード)",\r
259                         "4B(戻る)",\r
260                         "4C",\r
261                         "4D",\r
262                         "4E",\r
263                         "4F",\r
264                         "50",\r
265                         "51",\r
266                         "52(設定)",\r
267                         "53(クリア/先頭)",\r
268                         "54",\r
269                         "55(ワンタッチリプレイ)",\r
270                         "56",\r
271                         "57(全削除)",\r
272                         "58",\r
273                         "59",\r
274                         "5A(表示/残量)",\r
275                         "5B(ワンタッチスキップ)",\r
276                         "5C",\r
277                         "5D",\r
278                         "5E(ズーム)",\r
279                         "5F",\r
280                         "60(終了)",\r
281                         "61",\r
282                         "62(ヘルプ)",\r
283                         "63(W録)",\r
284                         "64",\r
285                         "65",\r
286                         "66",\r
287                         "67",\r
288                         "68",\r
289                         "69",\r
290                         "6A",\r
291                         "6B",\r
292                         "6C",\r
293                         "6D(番組表)",\r
294                         "6E",\r
295                         "6F",\r
296                         "70",\r
297                         "71",\r
298                         "72",\r
299                         "73",\r
300                         "74(XDE)",\r
301                         "75",\r
302                         "76",\r
303                         "77",\r
304                         "78",\r
305                         "79",\r
306                         "7A",\r
307                         "7B",\r
308                         "7C",\r
309                         "7D",\r
310                         "7E",\r
311                         "7F",\r
312                         "80(逆スキップ)",\r
313                         "81",\r
314                         "82",\r
315                         "83",\r
316                         "84(戻スキップ)",\r
317                         "85",\r
318                         "86",\r
319                         "87",\r
320                         "88(逆スロー)",\r
321                         "89",\r
322                         "8A",\r
323                         "8B",\r
324                         "8C(戻スロー)",\r
325                         "8D",\r
326                         "8E",\r
327                         "8F",\r
328                         "90",\r
329                         "91",\r
330                         "92",\r
331                         "93",\r
332                         "94",\r
333                         "95",\r
334                         "96",\r
335                         "97",\r
336                         "98(早送り)",\r
337                         "99",\r
338                         "9A(早戻し)",\r
339                         "9B",\r
340                         "9C",\r
341                         "9D(コマ送り)",\r
342                         "9E(コマ戻し)",\r
343                         "9F",\r
344                         "A0",\r
345                         "A1",\r
346                         "A2(ドライブ切換)",\r
347                         "A3",\r
348                         "A4",\r
349                         "A5",\r
350                         "A6",\r
351                         "A7(録画モード)",\r
352                         "A8",\r
353                         "A9",\r
354                         "AA",\r
355                         "AB",\r
356                         "AC",\r
357                         "AD(ワンタッチリプレイ)",\r
358                         "AE(ワンタッチスキップ)",\r
359                         "AF",\r
360                         "B0(解像度)",\r
361                         "B1",\r
362                         "B2",\r
363                         "B3",\r
364                         "B4(番組説明)",\r
365                         "B5(番組ナビ)",\r
366                         "B6",\r
367                         "B7",\r
368                         "B8",\r
369                         "B9",\r
370                         "BA",\r
371                         "BB",\r
372                         "BC",\r
373                         "BD",\r
374                         "BE",\r
375                         "BF",\r
376                         "C0(上)",\r
377                         "C1",\r
378                         "C2",\r
379                         "C3",\r
380                         "C4(右)",\r
381                         "C5",\r
382                         "C6",\r
383                         "C7",\r
384                         "C8(下)",\r
385                         "C9",\r
386                         "CA",\r
387                         "CB",\r
388                         "CC(左)",\r
389                         "CD",\r
390                         "CE",\r
391                         "CF",\r
392                         "D0(トップメニュー)",\r
393                         "D1(メニュー)",\r
394                         "D2(リターン)",\r
395                         "D3(音声/音多)",\r
396                         "D4(アングル)",\r
397                         "D5(字幕)",\r
398                         "D6",\r
399                         "D7",\r
400                         "D8",\r
401                         "D9(チャプター分割/結合)",\r
402                         "DA(タイムバー)",\r
403                         "DB",\r
404                         "DC",\r
405                         "DD",\r
406                         "DE(番組ナビ)",\r
407                         "DF(かんたんダビング)",\r
408                         "E0",\r
409                         "E1",\r
410                         "E2",\r
411                         "E3",\r
412                         "E4",\r
413                         "E5",\r
414                         "E6",\r
415                         "E7",\r
416                         "E8",\r
417                         "E9",\r
418                         "EA",\r
419                         "EB",\r
420                         "EC",\r
421                         "ED",\r
422                         "EE",\r
423                         "EF",\r
424                         "F0",\r
425                         "F1",\r
426                         "F2",\r
427                         "F3",\r
428                         "F4",\r
429                         "F5",\r
430                         "F6",\r
431                         "F7",\r
432                         "F8",\r
433                         "F9",\r
434                         "FA",\r
435                         "FB",\r
436                         "FC",\r
437                         "FD",\r
438                         "FE",\r
439                         "FF(電源入)",\r
440         };\r
441         \r
442         \r
443         \r
444         private String getCode2Key(String key) {\r
445                 for (String[] s : keydefs ) {\r
446                         if (s[0].equals(key)) {\r
447                                 return s[1];\r
448                         }\r
449                 }\r
450                 return null;\r
451         }\r
452         private String getKey2Code(String code) {\r
453                 for (String[] s : keydefs ) {\r
454                         if (s[1].equals(code)) {\r
455                                 return s[0];\r
456                         }\r
457                 }\r
458                 return null;\r
459         }\r
460         \r
461         private String getCode2Code(String code) {\r
462                 if (code.length() > 0) {\r
463                         for (String cStr : codedefs) {\r
464                                 if (cStr.startsWith(code)) {\r
465                                         return cStr;\r
466                                 }\r
467                         }\r
468                 }\r
469                 return null;\r
470         }\r
471         \r
472         /*\r
473          * 操作タブのコンポーネント\r
474          */\r
475         \r
476         private JPanel getJContentPane() {\r
477                 if (jContentPane == null) {\r
478                         jContentPane = new JPanel();\r
479                         jContentPane.setLayout(new BorderLayout());\r
480                         jContentPane.add(getJComboBox(), BorderLayout.NORTH);\r
481                         jContentPane.add(getJPanel(), BorderLayout.CENTER);\r
482                         jContentPane.add(getJLabel(), BorderLayout.SOUTH);\r
483 \r
484                         this.addComponentListener(new ComponentListener() {\r
485                                 @Override\r
486                                 public void componentHidden(ComponentEvent arg0) {\r
487                                 }\r
488                                 @Override\r
489                                 public void componentMoved(ComponentEvent arg0) {\r
490                                 }\r
491                                 @Override\r
492                                 public void componentResized(ComponentEvent arg0) {\r
493                                 }\r
494                                 @Override\r
495                                 public void componentShown(ComponentEvent arg0) {\r
496                                         jComboBox.requestFocusInWindow();       // フォーカスを移動する\r
497                                 }\r
498                         });\r
499                 }\r
500                 return jContentPane;\r
501         }\r
502         \r
503         private JComboBox getJComboBox() {\r
504                 if (jComboBox == null) {\r
505                         jComboBox = new JComboBox();\r
506                         \r
507                         /*\r
508                         jComboBox.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN,0),"none");\r
509                         jComboBox.getActionMap().put("none", null);\r
510                         */\r
511 \r
512                         // キー入力を受け付ける\r
513                         /*\r
514                         InputMap m = jComboBox.getInputMap();\r
515                         while (m != null){\r
516                                 m.clear();\r
517                                 m = m.getParent();\r
518                         }\r
519                         */\r
520                         ActionMap n = jComboBox.getActionMap();\r
521                         while (n != null){\r
522                                 n.clear();\r
523                                 n = n.getParent();\r
524                         }\r
525                         jComboBox.addKeyListener(new KeyAdapter() {\r
526                                 @Override\r
527                                 public void keyPressed(KeyEvent arg0) {\r
528                                         keyPressedAction(arg0.getKeyCode());\r
529                                 }\r
530                         });\r
531 \r
532             DefaultComboBoxModel model = (DefaultComboBoxModel) jComboBox.getModel();\r
533             for (RecorderInfo r : recorderList) {\r
534                 model.addElement(r.getRecorderIPAddr()+":"+r.getRecorderPortNo()+":"+r.getRecorderId());\r
535             }\r
536             \r
537             setSelectedRecorder();\r
538             \r
539             jComboBox.addActionListener(new ActionListener() {\r
540                                 @Override\r
541                                 public void actionPerformed(ActionEvent e) {\r
542                             setSelectedRecorder();\r
543                                 }\r
544             });\r
545                 }\r
546                 return jComboBox;\r
547         }\r
548         \r
549         private JPanel getJPanel() {\r
550                 if (jPanel == null) {\r
551                         jPanel = new JPanel();\r
552                         \r
553                         jPanel.setPreferredSize(new Dimension(maxCol*wBK, maxRow*hBK));\r
554                         jPanel.setLayout(new SpringLayout());\r
555                         layout = (SpringLayout) jPanel.getLayout();\r
556                         \r
557                         genBKSet();\r
558                 }\r
559                 return jPanel;\r
560         }\r
561         \r
562         private JLabel getJLabel() {\r
563                 if (jLabel == null) {\r
564                         jLabel = new JLabel();\r
565                         jLabel.setText(" ");\r
566                 }\r
567                 return jLabel;\r
568         }\r
569         \r
570         // キーアクション付きのボタンのクラス\r
571         private class BKSet extends JButton {\r
572                 public String button;\r
573                 public String key;\r
574                 public int row;\r
575                 public int column;\r
576                 public int kcode;\r
577                 public Color color;\r
578                 \r
579                 public int getKcode() {\r
580                         return kcode;\r
581                 }\r
582                 \r
583                 public void action() {\r
584                         String key = this.key.substring(0,2);\r
585                         jLabel.setText(this.button+"("+key+")");\r
586                         if ( ! key.equals("FF")) {\r
587                                 tainavi.HDDRecorderUtils ru = new tainavi.HDDRecorderUtils();\r
588                                 Authenticator.setDefault(ru.new MyAuthenticator(recinfo.getRecorderUser(), recinfo.getRecorderPasswd()));\r
589                                 ru.reqGET("http://"+recinfo.getRecorderIPAddr()+":"+recinfo.getRecorderPortNo()+"/remote/remote.htm?key="+key, null);\r
590                                 System.out.println(this.button+"->"+key);\r
591                         }\r
592                         else {\r
593                                 tainavi.HDDRecorderUtils ru = new tainavi.HDDRecorderUtils();\r
594                                 ru.setMacAddr(recinfo.getRecorderMacAddr());\r
595                                 ru.setBroadcast(recinfo.getRecorderBroadcast());\r
596                                 ru.wakeup();\r
597                         }\r
598                 }\r
599                 \r
600                 public BKSet(String button, String key, int row, int column, String kcode, Color c) {\r
601                         super();\r
602                         this.setText(button);\r
603                         this.button = button;\r
604                         this.key = key;\r
605                         this.row = row;\r
606                         this.column = column;\r
607                         this.kcode = -1;\r
608                         this.color = new Color(0,0,0);\r
609                         \r
610                         if ( ! button.equals("") ) {\r
611                                 if ( ! kcode.equals("")) {\r
612                                         this.kcode = Integer.parseInt(kcode,16);\r
613                                 }\r
614                                 \r
615                                 this.setForeground(this.color = c);\r
616                                 this.addMouseListener(new MouseAdapter() {\r
617                                         @Override\r
618                                         public void mousePressed(MouseEvent e) {\r
619                                                 action();\r
620                                         }\r
621                                 });\r
622                         }\r
623                         else {\r
624                                 this.setEnabled(false);\r
625                         }\r
626                         \r
627                         this.addKeyListener(new KeyAdapter() {\r
628                                 @Override\r
629                                 public void keyPressed(KeyEvent arg0) {\r
630                                         keyPressedAction(arg0.getKeyCode());\r
631                                 }\r
632                         });\r
633 \r
634                 }\r
635         }\r
636         \r
637         // コンボボックスの操作\r
638         private void setSelectedRecorder() {\r
639         DefaultComboBoxModel model = (DefaultComboBoxModel) jComboBox.getModel();\r
640         for (RecorderInfo r : recorderList) {\r
641                 if (model.getSelectedItem().equals(r.MySelf())) {\r
642                     recinfo = r;\r
643                     System.out.println(model.getSelectedItem());\r
644                         break;\r
645                 }\r
646         }\r
647         }\r
648         \r
649         // キーを押したときの動作\r
650         private void keyPressedAction(int kcode) {\r
651                 for (BKSet bk : bkset) {\r
652                         if (bk.getKcode() == kcode) {\r
653                                 bk.requestFocusInWindow();      // フォーカスを移動する\r
654                                 bk.action();                            // アクションを実行する\r
655                                 return;\r
656                         }\r
657                 }\r
658                 jLabel.setText("unknown keycode("+String.format("%02X",kcode)+")");\r
659         }\r
660         \r
661         /*\r
662          * 設定タブのコンポーネント\r
663          */\r
664         \r
665         private JPanel getJSettingPane() {\r
666                 if (jSettingPane == null) {\r
667                         jSettingPane = new JPanel();\r
668                         jSettingPane.setLayout(new BorderLayout());\r
669                         jSettingPane.add(getJScrollPane(), BorderLayout.CENTER);\r
670                         jSettingPane.add(getJButton("設定"), BorderLayout.SOUTH);\r
671                         \r
672                         setBK4Table();\r
673                 }\r
674                 return jSettingPane;\r
675         }\r
676         \r
677         private JScrollPane getJScrollPane() {\r
678                 if (jScrollPane == null) {\r
679                         jScrollPane = new JScrollPane();\r
680                         jScrollPane.setViewportView(getJTable());\r
681                 }\r
682                 return jScrollPane;\r
683         }\r
684         \r
685         private JTable getJTable() {\r
686                 if (jTable == null) {\r
687                         final String[] colname = { "配置", "ラベル","コード","キー","色" };\r
688                         final int[] colwidth = { 25,150,100,100,50 };\r
689                         \r
690                         DefaultTableModel model = new DefaultTableModel(colname, 0) {\r
691                                 @Override\r
692                                 public Object getValueAt(int row, int column) {\r
693                                         return rowData.get(row)[column];\r
694                                 }\r
695                                 @Override\r
696                                 public void setValueAt(Object aValue, int row, int column) {\r
697                                         rowData.get(row)[column] = (String) aValue;\r
698                                 }\r
699                                 @Override\r
700                                 public int getRowCount() {\r
701                                         return rowData.size();\r
702                                 }\r
703                                 @Override\r
704                                 public boolean isCellEditable(int row, int column) {\r
705                                         if (column == 0 || column == 4) {\r
706                                                 return false;\r
707                                         }\r
708                                         return true;\r
709                                 }\r
710                         };\r
711                         jTable = new JTable(model) {\r
712                                 private final Color evenColor = new Color(240,240,255);\r
713                                 @Override\r
714                                 public Component prepareRenderer(TableCellRenderer tcr, int row, int column) {\r
715                                         Component c = super.prepareRenderer(tcr, row, column);\r
716                                         if (column != 4) {\r
717                                                 if(isRowSelected(row)) {\r
718                                                         c.setForeground(getSelectionForeground());\r
719                                                         c.setBackground(getSelectionBackground());\r
720                                             }\r
721                                                 else {\r
722                                                         c.setForeground(getForeground());\r
723                                                         c.setBackground(((row/maxCol)%2==0)?evenColor:getBackground());\r
724                                                 }\r
725                                         }\r
726                                         return c;\r
727                            }\r
728                         };\r
729                         \r
730                         DefaultTableColumnModel colModel = (DefaultTableColumnModel) jTable.getColumnModel();\r
731                         TableColumn column = null;\r
732                         for (int i=0; i<colModel.getColumnCount() && i<colwidth.length ; i++){\r
733                                 column = colModel.getColumn(i);\r
734                                 column.setPreferredWidth(colwidth[i]);\r
735                         }\r
736                         \r
737                         JComboBox jcbcode = new JComboBox();\r
738                         jcbcode.setEditable(false);\r
739                         jcbcode.addItem("");\r
740                         for (String cd : codedefs) {\r
741                                 jcbcode.addItem(cd);\r
742                         }\r
743                         column = jTable.getColumn("コード");\r
744                         column.setCellEditor(new DefaultCellEditor(jcbcode));\r
745                         \r
746                         JComboBox jcbkey = new JComboBox();\r
747                         jcbkey.setEditable(false);\r
748                         jcbkey.addItem("");\r
749                         for (int i=1; i<255; i++) {\r
750                                 String key = getCode2Key(String.format("%02X", i));\r
751                                 if (key != null) {\r
752                                         jcbkey.addItem(key);\r
753                                 }\r
754                         }\r
755                         column = jTable.getColumn("キー");\r
756                         column.setCellEditor(new DefaultCellEditor(jcbkey));\r
757                         \r
758                         TableCellRenderer colorCellRenderer = new VWColorCellRenderer();\r
759                         jTable.getColumn("色").setCellRenderer(colorCellRenderer);\r
760                         \r
761                         jTable.addMouseListener(new MouseListener() {\r
762                                 @Override\r
763                                 public void mouseReleased(MouseEvent e) {}\r
764                                 @Override\r
765                                 public void mousePressed(MouseEvent e) {}\r
766                                 @Override\r
767                                 public void mouseExited(MouseEvent e) {}\r
768                                 @Override\r
769                                 public void mouseEntered(MouseEvent e) {}\r
770                                 @Override\r
771                                 public void mouseClicked(MouseEvent e) {\r
772                                         JTable t = (JTable) e.getSource();\r
773                                         Point p = e.getPoint();\r
774                                         Point p2 = jTabbedPane.getLocationOnScreen();\r
775                                         \r
776                                         int col = t.convertColumnIndexToModel(t.columnAtPoint(p));\r
777                                         if (col == 4) {\r
778                                                 int row = t.convertRowIndexToModel(t.rowAtPoint(p));\r
779                                                 ccwin.setColor(CommonUtils.str2color(rowData.get(row)[4].substring(0,7)));\r
780                                                 Rectangle r = jTable.getBounds();\r
781                                                 //ccwin.setPosition(p2.x,p2.y);\r
782                                                 CommonSwingUtils.setLocationCenter(Viewer.this, ccwin);\r
783                                                 ccwin.setVisible(true);\r
784                                                 Color c = ccwin.getSelectedColor();\r
785                                                 if (c != null) {\r
786                                                         String cs = CommonUtils.color2str(c);\r
787                                                         rowData.get(row)[4] = cs+";"+cs;\r
788                                                         ((AbstractTableModel) jTable.getModel()).fireTableDataChanged();\r
789                                                 }\r
790                                         }\r
791                                 }\r
792                         });\r
793                 }\r
794                 return jTable;\r
795         }\r
796         \r
797         private JButton getJButton(String s) {\r
798                 if (jButton == null) {\r
799                         jButton = new JButton(s);\r
800                         \r
801                         jButton.addActionListener(new ActionListener() {\r
802                                 @Override\r
803                                 public void actionPerformed(ActionEvent e) {\r
804                                         saveBKSet();\r
805                                         genBKSet();\r
806                                 }\r
807                         });\r
808                 }\r
809                 return jButton;\r
810         }\r
811         \r
812         private void setBK4Table() {\r
813                 final String cStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";\r
814                 int n = 0;\r
815                 for (int row=0; row<maxRow; row++) {\r
816                         for (int col=0; col<maxCol; col++) {\r
817                                 n = maxCol*row+col;\r
818                                 String[] dat = new String[] {\r
819                                         String.format("%s%d",cStr.substring(col,col+1),row+1),\r
820                                         bkset.get(n).button,\r
821                                         bkset.get(n).key,\r
822                                         (bkset.get(n).kcode != -1)?(getCode2Key(String.format("%02X",bkset.get(n).kcode))):(""),\r
823                                         CommonSwingUtils.getColoredString(bkset.get(n).color,CommonUtils.color2str(bkset.get(n).color))\r
824                                 };\r
825                                 rowData.add(dat);\r
826                         }\r
827                 }\r
828                 ((AbstractTableModel) jTable.getModel()).fireTableDataChanged();\r
829         }\r
830         \r
831         /*\r
832          * その他のメソッド\r
833          */\r
834         \r
835         // フォントを鯛ナビの設定におきかえる\r
836     private void updateFont(final String font, final int fontSize) {\r
837         FontUIResource fontUIResource = null;\r
838         UIDefaults defaultTable = UIManager.getLookAndFeelDefaults();\r
839         for(Object o: defaultTable.keySet()) {\r
840                         if(o.toString().toLowerCase().endsWith("font")) {\r
841                                 //System.out.println("set font to "+o.toString());\r
842                                 fontUIResource = (FontUIResource) UIManager.get(o);\r
843                                 fontUIResource = new FontUIResource(new Font(font, fontUIResource.getStyle(), fontSize));\r
844                                 UIManager.put(o, fontUIResource);\r
845                         }\r
846         }\r
847         SwingUtilities.updateComponentTreeUI(this);\r
848     }\r
849         \r
850     // ボタンの設定ファイルを読み出す\r
851         private void genBKSet() {\r
852                 File f = new File(defFileBK);\r
853                 if ( ! f.exists() ) {\r
854                         return;\r
855                 }\r
856                 try {\r
857                         bkset.removeAll(bkset);\r
858                         \r
859                         BufferedReader reader = new BufferedReader(new FileReader(f));\r
860                         String str = null;\r
861                         boolean isEOF = false;\r
862                         for (int row=0; row<maxRow; row++) {\r
863                                 for (int col=0; col<maxCol; col++) {\r
864                                         if ( ! isEOF) {\r
865                                                 if  ((str = reader.readLine()) != null) {\r
866                                                         Matcher ma = Pattern.compile("^\\s*\"(.*?)\"\\s*,\\s*\"(.*?)\"\\s*,\\s*\"(.*?)\"\\s*(,\\s*\"(..)(..)(..)\")?").matcher(str);\r
867                                                         if (ma.find()) {\r
868                                                                 Color c = new Color(Integer.parseInt(ma.group(5),16),Integer.parseInt(ma.group(6),16),Integer.parseInt(ma.group(7),16));\r
869                                                                 String cd = getCode2Code(ma.group(2));\r
870                                                                 bkset.add(new BKSet(ma.group(1),(cd==null)?(""):(cd),row,col,ma.group(3),c));\r
871                                                         }\r
872                                                 }\r
873                                                 else {\r
874                                                         isEOF = true;\r
875                                                 }\r
876                                         }\r
877                                         if (isEOF) {\r
878                                                 bkset.add(new BKSet("","",row,col,"",new Color(0,0,0)));\r
879                                         }\r
880                                 }\r
881                         }\r
882                         reader.close();\r
883                         \r
884                         // パネルに追加\r
885                         for (BKSet bk : bkset) {\r
886                                 bk.setPreferredSize(new Dimension(wBK,hBK));\r
887                             layout.putConstraint(SpringLayout.NORTH, bk, bk.row*hBK, SpringLayout.NORTH, jPanel);\r
888                             layout.putConstraint(SpringLayout.WEST, bk, bk.column*wBK, SpringLayout.WEST, jPanel);\r
889                             jPanel.add(bk);\r
890                         }\r
891                 }\r
892                 catch (Exception e) {\r
893                         e.printStackTrace();\r
894                 }\r
895         }\r
896         \r
897         private void saveBKSet() {\r
898                 File f = new File(defFileBK);\r
899                 try {\r
900                         BufferedWriter writer = new BufferedWriter(new FileWriter(f));\r
901                         for (int row=0; row<maxRow; row++) {\r
902                                 for (int col=0; col<maxCol; col++) {\r
903                                         int n = row*maxCol+col;\r
904                                         String code = rowData.get(n)[2];\r
905                                         String key = getKey2Code(rowData.get(n)[3]);\r
906                                         writer.write(String.format("\"%s\", \"%s\", \"%s\", \"%s\"\n",\r
907                                                         rowData.get(n)[1],\r
908                                                         (code == null || code.length() == 0)?(""):(code.substring(0,2)),\r
909                                                         (key == null)?(""):(key),\r
910                                                         rowData.get(n)[4].substring(1,7)));\r
911                                 }\r
912                         }\r
913                         writer.close();\r
914                         \r
915                         // パネルから全部削除\r
916                         jPanel.removeAll();\r
917                 }\r
918                 catch (Exception e) {\r
919                         e.printStackTrace();\r
920                 }\r
921         }\r
922     \r
923         \r
924         /**\r
925          * @param args\r
926          */\r
927         public static void main(String[] args) {\r
928                 SwingUtilities.invokeLater(new Runnable() {\r
929                         public void run() {\r
930                                 Viewer thisClass = new Viewer();\r
931                                 thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);\r
932                                 thisClass.setVisible(true);\r
933                         }\r
934                 });\r
935         }\r
936 \r
937         /**\r
938          * This is the default constructor\r
939          */\r
940         public Viewer() {\r
941                 super();\r
942                 initialize();\r
943         }\r
944 \r
945         /**\r
946          * This method initializes this\r
947          * \r
948          * @return void\r
949          */\r
950         private void initialize() {\r
951                 \r
952                 // 設定ファイルを読み込む\r
953                 String recip = "";\r
954                 Rectangle ra = new Rectangle();\r
955                 File f = new File(defFile);\r
956                 if ( f.exists() ) {\r
957                         try {\r
958                                 String str = null;\r
959                                 int i = 0;\r
960                                 BufferedReader reader = new BufferedReader(new FileReader(f));\r
961                                 while ((str = reader.readLine()) != null) {\r
962                                         switch (i++) {\r
963                                         case 0:\r
964                                                 recip = str;\r
965                                                 break;\r
966                                         case 1:\r
967                                                 ra.x = Integer.valueOf(str);\r
968                                                 break;\r
969                                         case 2:\r
970                                                 ra.y = Integer.valueOf(str);\r
971                                                 break;\r
972                                         }\r
973                                 }\r
974                         }\r
975                         catch (Exception e) {\r
976                                 e.printStackTrace();\r
977                         }\r
978                 }\r
979                 \r
980                 // 鯛ナビと タイニーシンクの設定から\r
981                 tainavi.Env env = new tainavi.Env();\r
982                 env.load();\r
983                 \r
984                 RecorderInfoList recInfos = new RecorderInfoList();\r
985                 recInfos.load();\r
986                 \r
987                 ArrayList<taiSync.RecorderInfo> syncrl = taiSync.RecorderInfo.load();\r
988                 \r
989                 for (RecorderInfo r : recInfos) {\r
990                         if ( r.getRecorderIPAddr().equals("") ) {\r
991                                 continue;\r
992                         }\r
993                 if ( ! r.getRecorderId().contains("RD-") && ! r.getRecorderId().contains("DBR-Z") ) {\r
994                         continue;\r
995                 }\r
996                 \r
997                 RecorderInfo rn = new RecorderInfo();\r
998                 if (r.getRecorderIPAddr().equals("127.0.0.1") || r.getRecorderIPAddr().equals("localhost")) {\r
999                         for (taiSync.RecorderInfo sr : syncrl) {\r
1000                                 if (sr.getLocalPort() == Integer.valueOf(r.getRecorderPortNo())) {\r
1001                                 rn.setRecorderIPAddr(sr.getRecorderIPAddr());\r
1002                                 rn.setRecorderPortNo(sr.getRecorderPortNo());\r
1003                                         rn.setRecorderUser(sr.getRecorderUser());\r
1004                                         rn.setRecorderPasswd(sr.getRecorderPasswd());\r
1005                                 }\r
1006                         }\r
1007                 }\r
1008                 if (rn.getRecorderIPAddr().equals("")) {\r
1009                         rn.setRecorderIPAddr(r.getRecorderIPAddr());\r
1010                         rn.setRecorderPortNo(r.getRecorderPortNo());\r
1011                         rn.setRecorderUser(r.getRecorderUser());\r
1012                         rn.setRecorderPasswd(r.getRecorderPasswd());\r
1013                 }\r
1014                 rn.setRecorderMacAddr(r.getRecorderMacAddr());\r
1015                 rn.setRecorderBroadcast(r.getRecorderBroadcast());\r
1016                 rn.setRecorderId(r.getRecorderId());\r
1017                 \r
1018                 recorderList.add(rn);\r
1019                 }\r
1020                 \r
1021                 if (env.getFontName() != null) {\r
1022                         updateFont(env.getFontName(), env.getFontSize());\r
1023                 }\r
1024                 \r
1025                 try {\r
1026                         final Image image = ImageIO.read(new File("icon/remocon.png"));\r
1027                         this.setIconImage(image);\r
1028                 } catch (IOException e) {\r
1029                         e.printStackTrace();\r
1030                 }\r
1031 \r
1032                 this.setResizable(false);\r
1033                 this.setContentPane(getJTabbedPane());\r
1034                 this.setTitle("RDリモコン");\r
1035                 this.pack();\r
1036                 \r
1037                 ccwin = new VWColorChooserDialog();\r
1038                 \r
1039                 Rectangle ws = this.getBounds();\r
1040                 ws.x = ra.x;\r
1041                 ws.y = ra.y;\r
1042                 this.setBounds(ws);\r
1043                 \r
1044                 // 前回選択していたレコーダーを再選択\r
1045                 if ( ! recip.equals("")) {\r
1046                         for (int idx=0; idx<recorderList.size(); idx++) {\r
1047                                 if (recorderList.get(idx).getRecorderIPAddr().equals(recip)) {\r
1048                                         jComboBox.setSelectedIndex(idx);\r
1049                                         break;\r
1050                                 }\r
1051                         }\r
1052                 }\r
1053                 \r
1054                 // ウィンドウを閉じたときの処理\r
1055                 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);\r
1056                 this.addWindowListener(new WindowListener() {\r
1057 \r
1058                         public void windowActivated(WindowEvent e) {}\r
1059                         public void windowClosed(WindowEvent e) {}\r
1060                         public void windowDeactivated(WindowEvent e) {}\r
1061                         public void windowDeiconified(WindowEvent e) {}\r
1062                         public void windowIconified(WindowEvent e) {}\r
1063                         public void windowOpened(WindowEvent e) {}\r
1064 \r
1065                         @Override\r
1066                         public void windowClosing(WindowEvent e) {\r
1067                                 final Viewer thisClass = (Viewer) e.getSource();\r
1068                                 Rectangle r = thisClass.getBounds();\r
1069                                 \r
1070                                 File f = new File(defFile);\r
1071                                 try {\r
1072                                         BufferedWriter writer = new BufferedWriter(new FileWriter(f));\r
1073                                         if (recinfo != null) {\r
1074                                                 writer.write(recinfo.getRecorderIPAddr()+"\n");\r
1075                                         }\r
1076                                         else {\r
1077                                                 writer.write("\n");\r
1078                                         }\r
1079                                         writer.write(r.x+"\n");\r
1080                                         writer.write(r.y+"\n");\r
1081                                         writer.write(r.width+"\n");\r
1082                                         writer.write(r.height+"\n");\r
1083                                         writer.close();\r
1084                                 }\r
1085                                 catch (Exception e1) {\r
1086                                         e1.printStackTrace();\r
1087                                 }\r
1088                         }\r
1089                 });\r
1090         }\r
1091 \r
1092         /**\r
1093          * This method initializes jContentPane\r
1094          * \r
1095          * @return javax.swing.JPanel\r
1096          */\r
1097         \r
1098         private JTabbedPane getJTabbedPane() {\r
1099                 if (jTabbedPane == null) {\r
1100                         jTabbedPane = new JTabbedPane();\r
1101                         \r
1102                         jTabbedPane.addTab("操作", getJContentPane());\r
1103                         jTabbedPane.addTab("設定", getJSettingPane());\r
1104                 }\r
1105                 return jTabbedPane;\r
1106         }\r
1107 }\r