001package jmri.jmrit.operations.rollingstock.engines.gui; 002 003import java.awt.Font; 004import java.beans.PropertyChangeEvent; 005import java.beans.PropertyChangeListener; 006import java.util.List; 007 008import javax.swing.*; 009import javax.swing.table.TableCellEditor; 010 011import jmri.InstanceManager; 012import jmri.jmrit.operations.OperationsTableModel; 013import jmri.jmrit.operations.rollingstock.RollingStock; 014import jmri.jmrit.operations.rollingstock.engines.*; 015import jmri.jmrit.operations.setup.Control; 016import jmri.jmrit.operations.setup.Setup; 017import jmri.util.swing.XTableColumnModel; 018import jmri.util.table.ButtonEditor; 019import jmri.util.table.ButtonRenderer; 020 021import org.slf4j.Logger; 022import org.slf4j.LoggerFactory; 023 024/** 025 * Table Model for edit of engines used by operations 026 * 027 * @author Daniel Boudreau Copyright (C) 2008, 2012, 2025 028 */ 029public class EnginesTableModel extends OperationsTableModel implements PropertyChangeListener { 030 031 EngineManager engineManager = InstanceManager.getDefault(EngineManager.class); // There is only one manager 032 033 // Defines the columns 034 private static final int SELECT_COLUMN = 0; 035 private static final int NUM_COLUMN = 1; 036 private static final int ROAD_COLUMN = 2; 037 private static final int MODEL_COLUMN = 3; 038 private static final int HP_COLUMN = 4; 039 private static final int WEIGHT_COLUMN = 5; 040 private static final int TYPE_COLUMN = 6; 041 private static final int LENGTH_COLUMN = 7; 042 private static final int CONSIST_COLUMN = 8; 043 private static final int LOCATION_COLUMN = 9; 044 private static final int RFID_WHERE_LAST_SEEN_COLUMN = 10; 045 private static final int RFID_WHEN_LAST_SEEN_COLUMN = 11; 046 private static final int DESTINATION_COLUMN = 12; 047 private static final int PREVIOUS_LOCATION_COLUMN = 13; 048 private static final int TRAIN_COLUMN = 14; 049 private static final int LAST_TRAIN_COLUMN = 15; 050 private static final int MOVES_COLUMN = 16; 051 private static final int BUILT_COLUMN = 17; 052 private static final int OWNER_COLUMN = 18; 053 private static final int VALUE_COLUMN = 19; 054 private static final int RFID_COLUMN = 20; 055 private static final int LAST_COLUMN = 21; 056 private static final int DCC_ADDRESS_COLUMN = 22; 057 private static final int PICKUP_COLUMN = 23; 058 private static final int SETOUT_COLUMN = 24; 059 private static final int COMMENT_COLUMN = 25; 060 private static final int SET_COLUMN = 26; 061 private static final int EDIT_COLUMN = 27; 062 063 private static final int HIGHEST_COLUMN = EDIT_COLUMN + 1; 064 065 public EnginesTableModel(boolean showAllLocos, String locationName, String trackName) { 066 super(); 067 showAll = showAllLocos; 068 this.locationName = locationName; 069 this.trackName = trackName; 070 engineManager.addPropertyChangeListener(this); 071 updateList(); 072 } 073 074 public final int SORTBY_NUMBER = 0; 075 public final int SORTBY_ROAD = 1; 076 public final int SORTBY_MODEL = 2; 077 public final int SORTBY_LOCATION = 3; 078 public final int SORTBY_DESTINATION = 4; 079 public final int SORTBY_TRAIN = 5; 080 public final int SORTBY_MOVES = 6; 081 public final int SORTBY_CONSIST = 7; 082 public final int SORTBY_BUILT = 8; 083 public final int SORTBY_OWNER = 9; 084 public final int SORTBY_VALUE = 10; 085 public final int SORTBY_RFID = 11; 086 public final int SORTBY_LAST = 12; 087 public final int SORTBY_HP = 13; 088 public final int SORTBY_DCC_ADDRESS = 14; 089 public final int SORTBY_PICKUP = 15; 090 public final int SORTBY_COMMENT = 16; 091 092 private int _sort = SORTBY_NUMBER; 093 094 /** 095 * Not all columns are visible at the same time. 096 * 097 * @param sort which sort is active 098 */ 099 public void setSort(int sort) { 100 _sort = sort; 101 updateList(); 102 if (sort == SORTBY_MOVES || 103 sort == SORTBY_BUILT || 104 sort == SORTBY_OWNER || 105 sort == SORTBY_VALUE || 106 sort == SORTBY_RFID || 107 sort == SORTBY_LAST || 108 sort == SORTBY_DCC_ADDRESS || 109 sort == SORTBY_PICKUP || 110 sort == SORTBY_COMMENT) { 111 XTableColumnModel tcm = (XTableColumnModel) _table.getColumnModel(); 112 tcm.setColumnVisible(tcm.getColumnByModelIndex(MOVES_COLUMN), sort == SORTBY_MOVES); 113 tcm.setColumnVisible(tcm.getColumnByModelIndex(BUILT_COLUMN), sort == SORTBY_BUILT); 114 tcm.setColumnVisible(tcm.getColumnByModelIndex(OWNER_COLUMN), sort == SORTBY_OWNER); 115 tcm.setColumnVisible(tcm.getColumnByModelIndex(VALUE_COLUMN), sort == SORTBY_VALUE); 116 tcm.setColumnVisible(tcm.getColumnByModelIndex(RFID_COLUMN), sort == SORTBY_RFID); 117 tcm.setColumnVisible(tcm.getColumnByModelIndex(RFID_WHEN_LAST_SEEN_COLUMN), sort == SORTBY_RFID); 118 tcm.setColumnVisible(tcm.getColumnByModelIndex(RFID_WHERE_LAST_SEEN_COLUMN), sort == SORTBY_RFID); 119 tcm.setColumnVisible(tcm.getColumnByModelIndex(PREVIOUS_LOCATION_COLUMN), sort == SORTBY_LAST); 120 tcm.setColumnVisible(tcm.getColumnByModelIndex(LAST_COLUMN), sort == SORTBY_LAST); 121 tcm.setColumnVisible(tcm.getColumnByModelIndex(LAST_TRAIN_COLUMN), sort == SORTBY_LAST); 122 tcm.setColumnVisible(tcm.getColumnByModelIndex(TRAIN_COLUMN), true); 123 tcm.setColumnVisible(tcm.getColumnByModelIndex(PICKUP_COLUMN), sort == SORTBY_PICKUP); 124 tcm.setColumnVisible(tcm.getColumnByModelIndex(SETOUT_COLUMN), sort == SORTBY_PICKUP); 125 tcm.setColumnVisible(tcm.getColumnByModelIndex(DCC_ADDRESS_COLUMN), sort == SORTBY_DCC_ADDRESS); 126 tcm.setColumnVisible(tcm.getColumnByModelIndex(COMMENT_COLUMN), sort == SORTBY_COMMENT); 127 } 128 fireTableDataChanged(); 129 } 130 131 public void toggleSelectVisible() { 132 XTableColumnModel tcm = (XTableColumnModel) _table.getColumnModel(); 133 tcm.setColumnVisible(tcm.getColumnByModelIndex(SELECT_COLUMN), 134 !tcm.isColumnVisible(tcm.getColumnByModelIndex(SELECT_COLUMN))); 135 } 136 137 public void resetCheckboxes() { 138 for (Engine engine : engineList) { 139 engine.setSelected(false); 140 } 141 } 142 143 public String getSortByName() { 144 return getSortByName(_sort); 145 } 146 147 public String getSortByName(int sort) { 148 switch (sort) { 149 case SORTBY_NUMBER: 150 return Bundle.getMessage("Number"); 151 case SORTBY_ROAD: 152 return Bundle.getMessage("Road"); 153 case SORTBY_MODEL: 154 return Bundle.getMessage("Model"); 155 case SORTBY_LOCATION: 156 return Bundle.getMessage("Location"); 157 case SORTBY_DESTINATION: 158 return Bundle.getMessage("Destination"); 159 case SORTBY_TRAIN: 160 return Bundle.getMessage("Train"); 161 case SORTBY_MOVES: 162 return Bundle.getMessage("Moves"); 163 case SORTBY_CONSIST: 164 return Bundle.getMessage("Consist"); 165 case SORTBY_BUILT: 166 return Bundle.getMessage("Built"); 167 case SORTBY_OWNER: 168 return Bundle.getMessage("Owner"); 169 case SORTBY_DCC_ADDRESS: 170 return Bundle.getMessage("DccAddress"); 171 case SORTBY_HP: 172 return Bundle.getMessage("HP"); 173 case SORTBY_VALUE: 174 return Setup.getValueLabel(); 175 case SORTBY_RFID: 176 return Setup.getRfidLabel(); 177 case SORTBY_LAST: 178 return Bundle.getMessage("Last"); 179 case SORTBY_COMMENT: 180 return Bundle.getMessage("Comment"); 181 default: 182 return Bundle.getMessage("ErrorTitle"); // NOI18N 183 } 184 } 185 186 /** 187 * Search for engine by road number 188 * 189 * @param roadNumber The string road number to search for. 190 * 191 * @return -1 if not found, table row number if found 192 */ 193 public int findEngineByRoadNumber(String roadNumber) { 194 return findRollingStockByRoadNumber(roadNumber, engineList); 195 } 196 197 public Engine getEngineAtIndex(int index) { 198 return engineList.get(index); 199 } 200 201 private void updateList() { 202 // first, remove listeners from the individual objects 203 removePropertyChangeEngines(); 204 engineList = getSelectedEngineList(); 205 // and add listeners back in 206 addPropertyChangeEngines(); 207 } 208 209 public List<Engine> getSelectedEngineList() { 210 return getEngineList(_sort); 211 } 212 213 public List<Engine> getEngineList(int sort) { 214 List<Engine> list; 215 switch (sort) { 216 case SORTBY_ROAD: 217 list = engineManager.getByRoadNameList(); 218 break; 219 case SORTBY_MODEL: 220 list = engineManager.getByModelList(); 221 break; 222 case SORTBY_LOCATION: 223 list = engineManager.getByLocationList(); 224 break; 225 case SORTBY_DESTINATION: 226 list = engineManager.getByDestinationList(); 227 break; 228 case SORTBY_TRAIN: 229 list = engineManager.getByTrainList(); 230 break; 231 case SORTBY_MOVES: 232 list = engineManager.getByMovesList(); 233 break; 234 case SORTBY_CONSIST: 235 list = engineManager.getByConsistList(); 236 break; 237 case SORTBY_OWNER: 238 list = engineManager.getByOwnerList(); 239 break; 240 case SORTBY_BUILT: 241 list = engineManager.getByBuiltList(); 242 break; 243 case SORTBY_VALUE: 244 list = engineManager.getByValueList(); 245 break; 246 case SORTBY_RFID: 247 list = engineManager.getByRfidList(); 248 break; 249 case SORTBY_LAST: 250 list = engineManager.getByLastDateList(); 251 break; 252 case SORTBY_PICKUP: 253 list = engineManager.getByPickupList(); 254 break; 255 case SORTBY_COMMENT: 256 list = engineManager.getByCommentList(); 257 break; 258 case SORTBY_NUMBER: 259 default: 260 list = engineManager.getByNumberList(); 261 } 262 filterList(list); 263 return list; 264 } 265 266 List<Engine> engineList = null; 267 268 EnginesTableFrame _frame; 269 270 void initTable(JTable table, EnginesTableFrame frame) { 271 super.initTable(table); 272 _frame = frame; 273 initTable(); 274 } 275 276 // Default engines frame table column widths, starts with Number column and ends with Edit 277 private final int[] _enginesTableColumnWidths = 278 {60, 60, 60, 65, 50, 65, 65, 35, 75, 190, 190, 190, 140, 190, 65, 90, 50, 50, 50, 50, 100, 130, 50, 50, 50, 279 100, 65, 70}; 280 281 void initTable() { 282 // Use XTableColumnModel so we can control which columns are visible 283 XTableColumnModel tcm = new XTableColumnModel(); 284 _table.setColumnModel(tcm); 285 _table.createDefaultColumnsFromModel(); 286 287 // Install the button handlers 288 ButtonRenderer buttonRenderer = new ButtonRenderer(); 289 tcm.getColumn(SET_COLUMN).setCellRenderer(buttonRenderer); 290 TableCellEditor buttonEditor = new ButtonEditor(new javax.swing.JButton()); 291 tcm.getColumn(SET_COLUMN).setCellEditor(buttonEditor); 292 tcm.getColumn(EDIT_COLUMN).setCellRenderer(buttonRenderer); 293 tcm.getColumn(EDIT_COLUMN).setCellEditor(buttonEditor); 294 295 // set column preferred widths 296 // load defaults, xml file data not found 297 for (int i = 0; i < tcm.getColumnCount(); i++) { 298 tcm.getColumn(i).setPreferredWidth(_enginesTableColumnWidths[i]); 299 } 300 _frame.loadTableDetails(_table); 301 302 // turn off columns 303 tcm.setColumnVisible(tcm.getColumnByModelIndex(BUILT_COLUMN), false); 304 tcm.setColumnVisible(tcm.getColumnByModelIndex(OWNER_COLUMN), false); 305 tcm.setColumnVisible(tcm.getColumnByModelIndex(VALUE_COLUMN), false); 306 tcm.setColumnVisible(tcm.getColumnByModelIndex(RFID_COLUMN), false); 307 tcm.setColumnVisible(tcm.getColumnByModelIndex(RFID_WHEN_LAST_SEEN_COLUMN), false); 308 tcm.setColumnVisible(tcm.getColumnByModelIndex(RFID_WHERE_LAST_SEEN_COLUMN), false); 309 tcm.setColumnVisible(tcm.getColumnByModelIndex(PREVIOUS_LOCATION_COLUMN), false); 310 tcm.setColumnVisible(tcm.getColumnByModelIndex(LAST_COLUMN), false); 311 tcm.setColumnVisible(tcm.getColumnByModelIndex(LAST_TRAIN_COLUMN), false); 312 tcm.setColumnVisible(tcm.getColumnByModelIndex(DCC_ADDRESS_COLUMN), false); 313 tcm.setColumnVisible(tcm.getColumnByModelIndex(PICKUP_COLUMN), false); 314 tcm.setColumnVisible(tcm.getColumnByModelIndex(SETOUT_COLUMN), false); 315 tcm.setColumnVisible(tcm.getColumnByModelIndex(COMMENT_COLUMN), false); 316 317 // turn on default 318 tcm.setColumnVisible(tcm.getColumnByModelIndex(MOVES_COLUMN), true); 319 } 320 321 @Override 322 public int getRowCount() { 323 return engineList.size(); 324 } 325 326 @Override 327 public int getColumnCount() { 328 return HIGHEST_COLUMN; 329 } 330 331 @Override 332 public String getColumnName(int col) { 333 switch (col) { 334 case SELECT_COLUMN: 335 return Bundle.getMessage("ButtonSelect"); 336 case NUM_COLUMN: 337 return Bundle.getMessage("Number"); 338 case ROAD_COLUMN: 339 return Bundle.getMessage("Road"); 340 case MODEL_COLUMN: 341 return Bundle.getMessage("Model"); 342 case HP_COLUMN: 343 return Bundle.getMessage("HP"); 344 case TYPE_COLUMN: 345 return Bundle.getMessage("Type"); 346 case LENGTH_COLUMN: 347 return Bundle.getMessage("Len"); 348 case WEIGHT_COLUMN: 349 return Bundle.getMessage("Weight"); 350 case CONSIST_COLUMN: 351 return Bundle.getMessage("Consist"); 352 case LOCATION_COLUMN: 353 return Bundle.getMessage("Location"); 354 case RFID_WHERE_LAST_SEEN_COLUMN: 355 return Bundle.getMessage("WhereLastSeen"); 356 case RFID_WHEN_LAST_SEEN_COLUMN: 357 return Bundle.getMessage("WhenLastSeen"); 358 case DESTINATION_COLUMN: 359 return Bundle.getMessage("Destination"); 360 case PREVIOUS_LOCATION_COLUMN: 361 return Bundle.getMessage("LastLocation"); 362 case TRAIN_COLUMN: 363 return Bundle.getMessage("Train"); 364 case LAST_TRAIN_COLUMN: 365 return Bundle.getMessage("LastTrain"); 366 case MOVES_COLUMN: 367 return Bundle.getMessage("Moves"); 368 case BUILT_COLUMN: 369 return Bundle.getMessage("Built"); 370 case OWNER_COLUMN: 371 return Bundle.getMessage("Owner"); 372 case VALUE_COLUMN: 373 return Setup.getValueLabel(); 374 case RFID_COLUMN: 375 return Setup.getRfidLabel(); 376 case LAST_COLUMN: 377 return Bundle.getMessage("LastMoved"); 378 case DCC_ADDRESS_COLUMN: 379 return Bundle.getMessage("DccAddress"); 380 case PICKUP_COLUMN: 381 return Bundle.getMessage("Pickup"); 382 case SETOUT_COLUMN: 383 return Bundle.getMessage("SetOut"); 384 case COMMENT_COLUMN: 385 return Bundle.getMessage("Comment"); 386 case SET_COLUMN: 387 return Bundle.getMessage("Set"); 388 case EDIT_COLUMN: 389 return Bundle.getMessage("ButtonEdit"); // titles above all columns 390 default: 391 return "unknown"; // NOI18N 392 } 393 } 394 395 @Override 396 public Class<?> getColumnClass(int col) { 397 switch (col) { 398 case SELECT_COLUMN: 399 return Boolean.class; 400 case SET_COLUMN: 401 case EDIT_COLUMN: 402 return JButton.class; 403 case LENGTH_COLUMN: 404 case MOVES_COLUMN: 405 return Integer.class; 406 default: 407 return String.class; 408 } 409 } 410 411 @Override 412 public boolean isCellEditable(int row, int col) { 413 Engine engine = engineList.get(row); 414 if (engine.isClone()) { 415 return false; 416 } 417 switch (col) { 418 case SELECT_COLUMN: 419 case SET_COLUMN: 420 case EDIT_COLUMN: 421 case MOVES_COLUMN: 422 case VALUE_COLUMN: 423 case RFID_COLUMN: 424 return true; 425 default: 426 return false; 427 } 428 } 429 430 @Override 431 public Object getValueAt(int row, int col) { 432 if (row >= getRowCount()) { 433 return "ERROR row " + row; // NOI18N 434 } 435 Engine engine = engineList.get(row); 436 if (engine == null) { 437 return "ERROR engine unknown " + row; // NOI18N 438 } 439 if (engine.isClone()) { 440 setToolTip(Bundle.getMessage("DoNotModifyClone", engine.toString()), col); 441 } else { 442 setToolTip(null, col); 443 } 444 switch (col) { 445 case SELECT_COLUMN: 446 return engine.isSelected(); 447 case NUM_COLUMN: 448 return engine.getNumber(); 449 case ROAD_COLUMN: 450 return engine.getRoadName(); 451 case LENGTH_COLUMN: 452 return engine.getLengthInteger(); 453 case MODEL_COLUMN: 454 return engine.getModel(); 455 case HP_COLUMN: 456 return engine.getHp(); 457 case TYPE_COLUMN: { 458 if (engine.isBunit()) { 459 return engine.getTypeName() + " " + Bundle.getMessage("(B)"); 460 } 461 return engine.getTypeName(); 462 } 463 case WEIGHT_COLUMN: 464 return engine.getWeightTons(); 465 case CONSIST_COLUMN: { 466 if (engine.isLead()) { 467 return engine.getConsistName() + "*"; 468 } 469 return engine.getConsistName(); 470 } 471 case LOCATION_COLUMN: { 472 String s = engine.getStatus(); 473 if (!engine.getLocationName().equals(Engine.NONE)) { 474 s = engine.getStatus() + engine.getLocationName() + " (" + engine.getTrackName() + ")"; 475 } 476 return s; 477 } 478 case RFID_WHERE_LAST_SEEN_COLUMN: { 479 return engine.getWhereLastSeenName() + 480 (engine.getTrackLastSeenName().equals(Engine.NONE) ? "" : " (" + engine.getTrackLastSeenName() + ")"); 481 } 482 case RFID_WHEN_LAST_SEEN_COLUMN: { 483 return engine.getWhenLastSeenDate(); 484 } 485 case DESTINATION_COLUMN: { 486 String s = ""; 487 if (!engine.getDestinationName().equals(Engine.NONE)) { 488 s = engine.getDestinationName() + " (" + engine.getDestinationTrackName() + ")"; 489 } 490 return s; 491 } 492 case PREVIOUS_LOCATION_COLUMN: { 493 String s = ""; 494 if (!engine.getLastLocationName().equals(Engine.NONE)) { 495 s = engine.getLastLocationName() + " (" + engine.getLastTrackName() + ")"; 496 } 497 return s; 498 } 499 case TRAIN_COLUMN: { 500 // if train was manually set by user add an asterisk 501 if (engine.getTrain() != null && engine.getRouteLocation() == null) { 502 return engine.getTrainName() + "*"; 503 } 504 return engine.getTrainName(); 505 } 506 case LAST_TRAIN_COLUMN: 507 return engine.getLastTrainName(); 508 case MOVES_COLUMN: 509 return engine.getMoves(); 510 case BUILT_COLUMN: 511 return engine.getBuilt(); 512 case OWNER_COLUMN: 513 return engine.getOwnerName(); 514 case VALUE_COLUMN: 515 return engine.getValue(); 516 case RFID_COLUMN: 517 return engine.getRfid(); 518 case LAST_COLUMN: 519 return engine.getSortDate(); 520 case DCC_ADDRESS_COLUMN: 521 return engine.getDccAddress(); 522 case PICKUP_COLUMN: 523 return engine.getPickupTime(); 524 case SETOUT_COLUMN: 525 return engine.getSetoutTime(); 526 case COMMENT_COLUMN: 527 return engine.getComment(); 528 case SET_COLUMN: 529 return Bundle.getMessage("Set"); 530 case EDIT_COLUMN: 531 return Bundle.getMessage("ButtonEdit"); 532 default: 533 return "unknown " + col; // NOI18N 534 } 535 } 536 537 EngineEditFrame engineEditFrame = null; 538 EngineSetFrame engineSetFrame = null; 539 540 @Override 541 public void setValueAt(Object value, int row, int col) { 542 Engine engine = engineList.get(row); 543 switch (col) { 544 case SELECT_COLUMN: 545 engine.setSelected(((Boolean) value).booleanValue()); 546 break; 547 case MOVES_COLUMN: 548 try { 549 engine.setMoves(Integer.parseInt(value.toString())); 550 } catch (NumberFormatException e) { 551 log.error("move count must be a number"); 552 } 553 break; 554 case BUILT_COLUMN: 555 engine.setBuilt(value.toString()); 556 break; 557 case OWNER_COLUMN: 558 engine.setOwnerName(value.toString()); 559 break; 560 case VALUE_COLUMN: 561 engine.setValue(value.toString()); 562 break; 563 case RFID_COLUMN: 564 engine.setRfid(value.toString()); 565 break; 566 case SET_COLUMN: 567 log.debug("Set engine location"); 568 if (engineSetFrame != null) { 569 engineSetFrame.dispose(); 570 } 571 // use invokeLater so new window appears on top 572 SwingUtilities.invokeLater(() -> { 573 engineSetFrame = new EngineSetFrame(); 574 engineSetFrame.initComponents(); 575 engineSetFrame.load(engine); 576 }); 577 break; 578 case EDIT_COLUMN: 579 log.debug("Edit engine"); 580 if (engineEditFrame != null) { 581 engineEditFrame.dispose(); 582 } 583 // use invokeLater so new window appears on top 584 SwingUtilities.invokeLater(() -> { 585 engineEditFrame = new EngineEditFrame(); 586 engineEditFrame.initComponents(); 587 engineEditFrame.load(engine); 588 }); 589 break; 590 default: 591 break; 592 } 593 } 594 595 @Override 596 protected Font getFont(int row) { 597 Engine eng = engineList.get(row); 598 if (eng.isClone() || engineManager.getClone(eng) != null) { 599 Font font = super.getFont(row); 600 font = new Font(font.getFontName(), Font.ITALIC, font.getSize()); 601 return font; 602 } 603 return super.getFont(row); 604 } 605 606 public void dispose() { 607 log.debug("dispose EngineTableModel"); 608 engineManager.removePropertyChangeListener(this); 609 removePropertyChangeEngines(); 610 if (engineSetFrame != null) { 611 engineSetFrame.dispose(); 612 } 613 if (engineEditFrame != null) { 614 engineEditFrame.dispose(); 615 } 616 } 617 618 private void addPropertyChangeEngines() { 619 for (RollingStock rs : engineManager.getList()) { 620 rs.addPropertyChangeListener(this); 621 } 622 } 623 624 private void removePropertyChangeEngines() { 625 for (RollingStock rs : engineManager.getList()) { 626 rs.removePropertyChangeListener(this); 627 } 628 } 629 630 @Override 631 public void propertyChange(PropertyChangeEvent e) { 632 if (Control.SHOW_PROPERTY) { 633 log.debug("Property change: ({}) old: ({}) new: ({})", e.getPropertyName(), e.getOldValue(), e 634 .getNewValue()); 635 } 636 if (e.getPropertyName().equals(EngineManager.LISTLENGTH_CHANGED_PROPERTY) || 637 e.getPropertyName().equals(ConsistManager.LISTLENGTH_CHANGED_PROPERTY)) { 638 updateList(); 639 fireTableDataChanged(); 640 } 641 // Engine length, type, and HP are based on model, so multiple changes 642 else if (e.getPropertyName().equals(Engine.LENGTH_CHANGED_PROPERTY) || 643 e.getPropertyName().equals(Engine.TYPE_CHANGED_PROPERTY) || 644 e.getPropertyName().equals(Engine.HP_CHANGED_PROPERTY)) { 645 fireTableDataChanged(); 646 } 647 // must be a engine change 648 else if (e.getSource().getClass().equals(Engine.class)) { 649 Engine engine = (Engine) e.getSource(); 650 int row = engineList.indexOf(engine); 651 if (Control.SHOW_PROPERTY) { 652 log.debug("Update engine table row: {}", row); 653 } 654 if (row >= 0) { 655 fireTableRowsUpdated(row, row); 656 // next is needed when only showing engines at a location or track 657 } else if (e.getPropertyName().equals(Engine.TRACK_CHANGED_PROPERTY)) { 658 updateList(); 659 fireTableDataChanged(); 660 } 661 } 662 } 663 664 private static final Logger log = LoggerFactory.getLogger(EnginesTableModel.class); 665}