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
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
56 import javax.swing.JLabel;
\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
65 public class Viewer extends JFrame {
\r
67 private static final long serialVersionUID = 1L;
\r
69 private JTabbedPane jTabbedPane = null;
\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
76 private SpringLayout layout = null;
\r
77 private final int wBK = 100;
\r
78 private final int hBK = 30;
\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
85 private VWColorChooserDialog ccwin = null;
\r
87 private final String defFile = "env/RemoteCtrlIni.def";
\r
88 private final String defFileBK = "env/RemoteCtrl.def";
\r
90 final private ArrayList<BKSet> bkset = new ArrayList<BKSet>();
\r
91 final private ArrayList<String[]> rowData = new ArrayList<String[]>();
\r
93 private RecorderInfo recinfo = null;
\r
96 * 鯛ナビのレコーダ一覧の中で"RD-"を含むもののみ抽出したリスト.
\r
98 private RecorderInfoList recorderList = new RecorderInfoList();
\r
100 final int maxCol = 5;
\r
101 final int maxRow = 20;
\r
103 final String[][] keydefs = {
\r
104 {"08","BACK SPACE"},
\r
113 {"22","PAGE DOWN"},
\r
183 final String[] codedefs = {
\r
444 private String getCode2Key(String key) {
\r
445 for (String[] s : keydefs ) {
\r
446 if (s[0].equals(key)) {
\r
452 private String getKey2Code(String code) {
\r
453 for (String[] s : keydefs ) {
\r
454 if (s[1].equals(code)) {
\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
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
484 this.addComponentListener(new ComponentListener() {
\r
486 public void componentHidden(ComponentEvent arg0) {
\r
489 public void componentMoved(ComponentEvent arg0) {
\r
492 public void componentResized(ComponentEvent arg0) {
\r
495 public void componentShown(ComponentEvent arg0) {
\r
496 jComboBox.requestFocusInWindow(); // フォーカスを移動する
\r
500 return jContentPane;
\r
503 private JComboBox getJComboBox() {
\r
504 if (jComboBox == null) {
\r
505 jComboBox = new JComboBox();
\r
508 jComboBox.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN,0),"none");
\r
509 jComboBox.getActionMap().put("none", null);
\r
514 InputMap m = jComboBox.getInputMap();
\r
520 ActionMap n = jComboBox.getActionMap();
\r
525 jComboBox.addKeyListener(new KeyAdapter() {
\r
527 public void keyPressed(KeyEvent arg0) {
\r
528 keyPressedAction(arg0.getKeyCode());
\r
532 DefaultComboBoxModel model = (DefaultComboBoxModel) jComboBox.getModel();
\r
533 for (RecorderInfo r : recorderList) {
\r
534 model.addElement(r.getRecorderIPAddr()+":"+r.getRecorderPortNo()+":"+r.getRecorderId());
\r
537 setSelectedRecorder();
\r
539 jComboBox.addActionListener(new ActionListener() {
\r
541 public void actionPerformed(ActionEvent e) {
\r
542 setSelectedRecorder();
\r
549 private JPanel getJPanel() {
\r
550 if (jPanel == null) {
\r
551 jPanel = new JPanel();
\r
553 jPanel.setPreferredSize(new Dimension(maxCol*wBK, maxRow*hBK));
\r
554 jPanel.setLayout(new SpringLayout());
\r
555 layout = (SpringLayout) jPanel.getLayout();
\r
562 private JLabel getJLabel() {
\r
563 if (jLabel == null) {
\r
564 jLabel = new JLabel();
\r
565 jLabel.setText(" ");
\r
570 // キーアクション付きのボタンのクラス
\r
571 private class BKSet extends JButton {
\r
572 public String button;
\r
577 public Color color;
\r
579 public int getKcode() {
\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
593 tainavi.HDDRecorderUtils ru = new tainavi.HDDRecorderUtils();
\r
594 ru.setMacAddr(recinfo.getRecorderMacAddr());
\r
595 ru.setBroadcast(recinfo.getRecorderBroadcast());
\r
600 public BKSet(String button, String key, int row, int column, String kcode, Color c) {
\r
602 this.setText(button);
\r
603 this.button = button;
\r
606 this.column = column;
\r
608 this.color = new Color(0,0,0);
\r
610 if ( ! button.equals("") ) {
\r
611 if ( ! kcode.equals("")) {
\r
612 this.kcode = Integer.parseInt(kcode,16);
\r
615 this.setForeground(this.color = c);
\r
616 this.addMouseListener(new MouseAdapter() {
\r
618 public void mousePressed(MouseEvent e) {
\r
624 this.setEnabled(false);
\r
627 this.addKeyListener(new KeyAdapter() {
\r
629 public void keyPressed(KeyEvent arg0) {
\r
630 keyPressedAction(arg0.getKeyCode());
\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
643 System.out.println(model.getSelectedItem());
\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
658 jLabel.setText("unknown keycode("+String.format("%02X",kcode)+")");
\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
674 return jSettingPane;
\r
677 private JScrollPane getJScrollPane() {
\r
678 if (jScrollPane == null) {
\r
679 jScrollPane = new JScrollPane();
\r
680 jScrollPane.setViewportView(getJTable());
\r
682 return jScrollPane;
\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
690 DefaultTableModel model = new DefaultTableModel(colname, 0) {
\r
692 public Object getValueAt(int row, int column) {
\r
693 return rowData.get(row)[column];
\r
696 public void setValueAt(Object aValue, int row, int column) {
\r
697 rowData.get(row)[column] = (String) aValue;
\r
700 public int getRowCount() {
\r
701 return rowData.size();
\r
704 public boolean isCellEditable(int row, int column) {
\r
705 if (column == 0 || column == 4) {
\r
711 jTable = new JTable(model) {
\r
712 private final Color evenColor = new Color(240,240,255);
\r
714 public Component prepareRenderer(TableCellRenderer tcr, int row, int column) {
\r
715 Component c = super.prepareRenderer(tcr, row, column);
\r
717 if(isRowSelected(row)) {
\r
718 c.setForeground(getSelectionForeground());
\r
719 c.setBackground(getSelectionBackground());
\r
722 c.setForeground(getForeground());
\r
723 c.setBackground(((row/maxCol)%2==0)?evenColor:getBackground());
\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
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
743 column = jTable.getColumn("コード");
\r
744 column.setCellEditor(new DefaultCellEditor(jcbcode));
\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
752 jcbkey.addItem(key);
\r
755 column = jTable.getColumn("キー");
\r
756 column.setCellEditor(new DefaultCellEditor(jcbkey));
\r
758 TableCellRenderer colorCellRenderer = new VWColorCellRenderer();
\r
759 jTable.getColumn("色").setCellRenderer(colorCellRenderer);
\r
761 jTable.addMouseListener(new MouseListener() {
\r
763 public void mouseReleased(MouseEvent e) {}
\r
765 public void mousePressed(MouseEvent e) {}
\r
767 public void mouseExited(MouseEvent e) {}
\r
769 public void mouseEntered(MouseEvent e) {}
\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
776 int col = t.convertColumnIndexToModel(t.columnAtPoint(p));
\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
786 String cs = CommonUtils.color2str(c);
\r
787 rowData.get(row)[4] = cs+";"+cs;
\r
788 ((AbstractTableModel) jTable.getModel()).fireTableDataChanged();
\r
797 private JButton getJButton(String s) {
\r
798 if (jButton == null) {
\r
799 jButton = new JButton(s);
\r
801 jButton.addActionListener(new ActionListener() {
\r
803 public void actionPerformed(ActionEvent e) {
\r
812 private void setBK4Table() {
\r
813 final String cStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
\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
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
828 ((AbstractTableModel) jTable.getModel()).fireTableDataChanged();
\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
847 SwingUtilities.updateComponentTreeUI(this);
\r
851 private void genBKSet() {
\r
852 File f = new File(defFileBK);
\r
853 if ( ! f.exists() ) {
\r
857 bkset.removeAll(bkset);
\r
859 BufferedReader reader = new BufferedReader(new FileReader(f));
\r
861 boolean isEOF = false;
\r
862 for (int row=0; row<maxRow; row++) {
\r
863 for (int col=0; col<maxCol; col++) {
\r
865 if ((str = reader.readLine()) != null) {
\r
866 Matcher ma = Pattern.compile("^\\s*\"(.*?)\"\\s*,\\s*\"(.*?)\"\\s*,\\s*\"(.*?)\"\\s*(,\\s*\"(..)(..)(..)\")?").matcher(str);
\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
878 bkset.add(new BKSet("","",row,col,"",new Color(0,0,0)));
\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
892 catch (Exception e) {
\r
893 e.printStackTrace();
\r
897 private void saveBKSet() {
\r
898 File f = new File(defFileBK);
\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
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
916 jPanel.removeAll();
\r
918 catch (Exception e) {
\r
919 e.printStackTrace();
\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
938 * This is the default constructor
\r
946 * This method initializes this
\r
950 private void initialize() {
\r
954 Rectangle ra = new Rectangle();
\r
955 File f = new File(defFile);
\r
956 if ( f.exists() ) {
\r
960 BufferedReader reader = new BufferedReader(new FileReader(f));
\r
961 while ((str = reader.readLine()) != null) {
\r
967 ra.x = Integer.valueOf(str);
\r
970 ra.y = Integer.valueOf(str);
\r
975 catch (Exception e) {
\r
976 e.printStackTrace();
\r
980 // 鯛ナビと タイニーシンクの設定から
\r
981 tainavi.Env env = new tainavi.Env();
\r
984 RecorderInfoList recInfos = new RecorderInfoList();
\r
987 ArrayList<taiSync.RecorderInfo> syncrl = taiSync.RecorderInfo.load();
\r
989 for (RecorderInfo r : recInfos) {
\r
990 if ( r.getRecorderIPAddr().equals("") ) {
\r
993 if ( ! r.getRecorderId().contains("RD-") && ! r.getRecorderId().contains("DBR-Z") ) {
\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
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
1014 rn.setRecorderMacAddr(r.getRecorderMacAddr());
\r
1015 rn.setRecorderBroadcast(r.getRecorderBroadcast());
\r
1016 rn.setRecorderId(r.getRecorderId());
\r
1018 recorderList.add(rn);
\r
1021 if (env.getFontName() != null) {
\r
1022 updateFont(env.getFontName(), env.getFontSize());
\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
1032 this.setResizable(false);
\r
1033 this.setContentPane(getJTabbedPane());
\r
1034 this.setTitle("RDリモコン");
\r
1037 ccwin = new VWColorChooserDialog();
\r
1039 Rectangle ws = this.getBounds();
\r
1042 this.setBounds(ws);
\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
1055 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
\r
1056 this.addWindowListener(new WindowListener() {
\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
1066 public void windowClosing(WindowEvent e) {
\r
1067 final Viewer thisClass = (Viewer) e.getSource();
\r
1068 Rectangle r = thisClass.getBounds();
\r
1070 File f = new File(defFile);
\r
1072 BufferedWriter writer = new BufferedWriter(new FileWriter(f));
\r
1073 if (recinfo != null) {
\r
1074 writer.write(recinfo.getRecorderIPAddr()+"\n");
\r
1077 writer.write("\n");
\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
1085 catch (Exception e1) {
\r
1086 e1.printStackTrace();
\r
1093 * This method initializes jContentPane
\r
1095 * @return javax.swing.JPanel
\r
1098 private JTabbedPane getJTabbedPane() {
\r
1099 if (jTabbedPane == null) {
\r
1100 jTabbedPane = new JTabbedPane();
\r
1102 jTabbedPane.addTab("操作", getJContentPane());
\r
1103 jTabbedPane.addTab("設定", getJSettingPane());
\r
1105 return jTabbedPane;
\r