001package jmri.jmrit.throttle; 002 003import java.awt.*; 004 005import javax.swing.BorderFactory; 006import javax.swing.ImageIcon; 007import javax.swing.JLabel; 008import javax.swing.JPanel; 009import javax.swing.JProgressBar; 010import javax.swing.JTable; 011import javax.swing.border.BevelBorder; 012import javax.swing.table.TableCellRenderer; 013 014import jmri.Consist; 015import jmri.DccLocoAddress; 016import jmri.InstanceManager; 017import jmri.Throttle; 018import jmri.jmrit.roster.RosterIconFactory; 019import jmri.util.FileUtil; 020 021/** 022 * A TableCellRender to graphicaly display an active throttles in a summary table 023 * (see ThrottlesListPanel) 024 * 025 * @author Lionel Jeanson - 2011 026 * 027 */ 028 029public class ThrottlesTableCellRenderer implements TableCellRenderer { 030 031 private static final ImageIcon FWD_ICN = new ImageIcon(FileUtil.findURL("resources/icons/throttles/dirFwdOn.png")); 032 private static final ImageIcon BCK_ICN = new ImageIcon(FileUtil.findURL("resources/icons/throttles/dirBckOn.png")); 033 private static final ImageIcon ESTOP_ICN = new ImageIcon(FileUtil.findURL("resources/icons/throttles/estop24.png")); 034 private static final RosterIconFactory ICN_FACT = new RosterIconFactory(32); 035 final static int LINE_HEIGHT = 42; 036 037 @Override 038 public Component getTableCellRendererComponent(JTable jtable, Object value, boolean bln, boolean bln1, int i, int i1) { 039 JPanel retPanel = new JPanel(); 040 retPanel.setLayout(new BorderLayout()); 041 042 if (value == null) { 043 return retPanel; 044 } 045 046 ThrottleFrame tf = (ThrottleFrame) value; 047 // loco icon 048 if ((tf.getAddressPanel().getConsistAddress() != null) && (tf.getAddressPanel().getThrottle() != null)) { 049 // consists 050 JPanel consistPanel = new JPanel(); 051 consistPanel.setLayout(new FlowLayout()); 052 consistPanel.setOpaque(false); 053 Consist consist = InstanceManager.getDefault(jmri.ConsistManager.class).getConsist(tf.getAddressPanel().getConsistAddress()); 054 String consistName = ""; 055 for (DccLocoAddress loco : consist.getConsistList()) { 056 String reName = consist.getRosterId(loco); 057 JLabel label; 058 if (reName != null) { 059 consistName = " ["+reName+"]" + consistName ; 060 label = new JLabel(); 061 ImageIcon icon; 062 Boolean dir = consist.getLocoDirection(loco); 063 if (dir) { 064 icon = ICN_FACT.getIcon(reName); 065 } else { 066 icon = ICN_FACT.getReversedIcon(reName); 067 } 068 if (icon != null) { 069 icon.setImageObserver(jtable); 070 label.setIcon(icon); 071 } else { 072 label.setName(reName); 073 } 074 } else { 075 label = new JLabel("["+loco.toString()+"]"); 076 consistName = " ["+loco.toString()+"]" + consistName ; 077 } 078 consistPanel.add(label,0); //always add last at first, the consist is facing right 079 } 080 consistPanel.add(new JLabel(consistName)); 081 retPanel.add(consistPanel, BorderLayout.CENTER); 082 } else { // regular locomotive 083 ImageIcon icon = null; 084 String text; 085 if (tf.getRosterEntry() != null) { 086 icon = ICN_FACT.getIcon(tf.getAddressPanel().getRosterEntry()); 087 text = tf.getAddressPanel().getRosterEntry().getId(); 088 } else if ((tf.getAddressPanel().getCurrentAddress() != null) && (tf.getAddressPanel().getThrottle() != null)) { 089 switch (tf.getAddressPanel().getCurrentAddress().getNumber()) { 090 case 0: 091 text = Bundle.getMessage("ThrottleDCControl") + " - " + tf.getAddressPanel().getCurrentAddress(); 092 break; 093 case 3: 094 text = Bundle.getMessage("ThrottleDCCControl") + " - " + tf.getAddressPanel().getCurrentAddress(); 095 break; 096 default: 097 text = Bundle.getMessage("ThrottleAddress") + " " + tf.getAddressPanel().getCurrentAddress(); 098 break; 099 } 100 } else { 101 text = Bundle.getMessage("ThrottleNotAssigned"); 102 } 103 if (icon != null) { 104 icon.setImageObserver(jtable); 105 } 106 JLabel locoID = new JLabel(); 107 locoID.setHorizontalAlignment(JLabel.CENTER); 108 locoID.setVerticalAlignment(JLabel.CENTER); 109 locoID.setIcon(icon); 110 locoID.setText(text); 111 retPanel.add(locoID, BorderLayout.CENTER); 112 } 113 114 if (tf.getAddressPanel().getThrottle() != null) { 115 final ThrottlesPreferences preferences = InstanceManager.getDefault(ThrottlesPreferences.class); 116 JPanel ctrlPanel = new JPanel(); 117 ctrlPanel.setLayout(new BorderLayout()); 118 Throttle thr = tf.getAddressPanel().getThrottle(); 119 // direction 120 JLabel dir = new JLabel(); 121 if (preferences.isUsingExThrottle() && preferences.isUsingFunctionIcon()) { 122 if (thr.getIsForward()) { 123 dir.setIcon(FWD_ICN); 124 } else { 125 dir.setIcon(BCK_ICN); 126 } 127 } else { 128 if (thr.getIsForward()) { 129 dir.setText(Bundle.getMessage("ButtonForward")); 130 } else { 131 dir.setText(Bundle.getMessage("ButtonReverse")); 132 } 133 } 134 dir.setVerticalAlignment(JLabel.CENTER); 135 ctrlPanel.add(dir, BorderLayout.WEST); 136 // speed 137 if (preferences.isUsingExThrottle() && preferences.isUsingFunctionIcon()) { 138 if (thr.getSpeedSetting() == -1) { 139 JLabel estop = new JLabel(); 140 estop.setPreferredSize(new Dimension(64, LINE_HEIGHT - 8)); 141 estop.setHorizontalAlignment(JLabel.CENTER); 142 estop.setIcon(ESTOP_ICN); 143 ctrlPanel.add(estop, BorderLayout.CENTER); 144 } else { 145 JProgressBar speedBar = new javax.swing.JProgressBar(); 146 speedBar.setPreferredSize(new Dimension(64, LINE_HEIGHT - 8)); 147 speedBar.setMinimum(0); 148 speedBar.setMaximum(100); 149 speedBar.setValue((int) (thr.getSpeedSetting() * 100f)); 150 ctrlPanel.add(speedBar, BorderLayout.CENTER); 151 } 152 } else { 153 JLabel speedLabel = new JLabel(""); 154 if (thr.getSpeedSetting() == -1) { 155 speedLabel.setText(" " + Bundle.getMessage("ButtonEStop") + " "); 156 } else { 157 speedLabel.setText(" " + (int) (thr.getSpeedSetting() * 100f) + "% "); 158 } 159 ctrlPanel.add(speedLabel, BorderLayout.CENTER); 160 } 161 ctrlPanel.setOpaque(false); 162 retPanel.add(ctrlPanel, BorderLayout.EAST); 163 } 164 // visibility -> selected 165 if (tf.isVisible()) { 166 retPanel.setBackground(javax.swing.UIManager.getDefaults().getColor("List.selectionBackground")); 167 retPanel.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); 168 } else { 169 retPanel.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED)); 170 } 171 return retPanel; 172 } 173}