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}