001package jmri.jmrit.operations;
002
003import java.awt.Color;
004import java.awt.Component;
005import java.util.List;
006
007import javax.swing.JComboBox;
008import javax.swing.JTable;
009import javax.swing.table.DefaultTableCellRenderer;
010
011import jmri.jmrit.operations.rollingstock.RollingStock;
012import jmri.jmrit.operations.trains.trainbuilder.TrainCommon;
013
014/**
015 * Common table model methods for operations.
016 * 
017 * @author Daniel Boudreau Copyright (C) 2023, 2025
018 */
019public abstract class OperationsTableModel extends javax.swing.table.AbstractTableModel {
020    
021    protected JTable _table;
022    
023    public void initTable(JTable table) {
024        _table = table;
025        table.setDefaultRenderer(JComboBox.class, new jmri.jmrit.symbolicprog.ValueRenderer());
026        table.setDefaultEditor(JComboBox.class, new jmri.jmrit.symbolicprog.ValueEditor());
027        table.setDefaultRenderer(Object.class, new MyTableCellRenderer());
028        table.setDefaultRenderer(Integer.class, new MyTableCellRenderer());
029    }
030
031    protected Color getForegroundColor(int row) {
032        return _table.getForeground();
033    }
034    
035    /**
036     * Search list for rolling stock by road number
037     * 
038     * @param roadNumber The string road number to search for.
039     * @param rsList     The list to search
040     * @return -1 if not found, table row number if found
041     */
042    public int findRollingStockByRoadNumber(String roadNumber, List<?> rsList) {
043        if (rsList != null) {
044            if (!roadNumber.equals(_roadNumber)) {
045                return getIndex(0, roadNumber, rsList);
046            }
047            int index = getIndex(_index, roadNumber, rsList);
048            if (index > 0) {
049                return index;
050            }
051            return getIndex(0, roadNumber, rsList);
052        }
053        return -1;
054    }
055
056    protected String _roadNumber = "";
057    protected int _index = 0;
058
059    protected int getIndex(int start, String roadNumber, List<?> rsList) {
060        for (int index = start; index < rsList.size(); index++) {
061            RollingStock rs = (RollingStock) rsList.get(index);
062            if (rs != null) {
063                _roadNumber = roadNumber;
064                _index = index + 1;
065                String[] number = rs.getNumber().split(TrainCommon.HYPHEN);
066                // check for wild card '*'
067                if (roadNumber.startsWith("*") && roadNumber.endsWith("*") && roadNumber.length() > 1) {
068                    String rN = roadNumber.substring(1, roadNumber.length() - 1);
069                    if (rs.getNumber().contains(rN)) {
070                        return index;
071                    }
072                } else if (roadNumber.startsWith("*")) {
073                    String rN = roadNumber.substring(1);
074                    if (rs.getNumber().endsWith(rN) || number[0].endsWith(rN)) {
075                        return index;
076                    }
077                } else if (roadNumber.endsWith("*")) {
078                    String rN = roadNumber.substring(0, roadNumber.length() - 1);
079                    if (rs.getNumber().startsWith(rN)) {
080                        return index;
081                    }
082                } else if (roadNumber.contains("*")) {
083                    String rn = roadNumber.replace("*", ":");
084                    String[] rN = rn.split(":");
085                    if (rs.getNumber().startsWith(rN[0]) && number[0].endsWith(rN[rN.length - 1])) {
086                        return index;
087                    }
088                } else if (rs.getNumber().equals(roadNumber) || number[0].equals(roadNumber)) {
089                    return index;
090                }
091            }
092        }
093        _roadNumber = "";
094        return -1;
095    }
096
097    public class MyTableCellRenderer extends DefaultTableCellRenderer {
098        @Override
099        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
100                int row, int column) {
101            Component component = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
102            if (!isSelected) {
103                int modelRow = table.convertRowIndexToModel(row);
104                component.setForeground(getForegroundColor(modelRow));
105            }
106            return component;
107        }
108    }
109}