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}