001package jmri.jmrit.picker; 002 003import java.util.*; 004 005import javax.annotation.CheckForNull; 006import javax.annotation.CheckReturnValue; 007import javax.annotation.Nonnull; 008import javax.swing.JTable; 009import javax.swing.ListSelectionModel; 010import javax.swing.SortOrder; 011import javax.swing.table.TableColumn; 012import javax.swing.table.TableColumnModel; 013import javax.swing.table.TableRowSorter; 014 015import jmri.*; 016import jmri.jmrit.beantable.BeanTableDataModel; 017import jmri.jmrit.entryexit.*; 018import jmri.jmrit.logix.*; 019import jmri.jmrit.logixng.GlobalVariable; 020import jmri.jmrit.logixng.GlobalVariableManager; 021import jmri.jmrit.logixng.NamedTable; 022import jmri.jmrit.logixng.NamedTableManager; 023import jmri.swing.RowSorterUtil; 024import jmri.util.*; 025import jmri.util.swing.XTableColumnModel; 026 027import org.slf4j.Logger; 028import org.slf4j.LoggerFactory; 029 030/** 031 * Abstract class to make pick lists for NamedBeans; Table model for pick lists 032 * in IconAdder 033 * <p> 034 * Concrete pick list class for many beans are include at the end of this file. 035 * This class also has instantiation methods serve as a factory for those 036 * classes. 037 * <p> 038 * Note: Extensions of this class must call init() after instantiation. 039 * 040 * <hr> 041 * This file is part of JMRI. 042 * <p> 043 * JMRI is free software; you can redistribute it and/or modify it under the 044 * terms of version 2 of the GNU General Public License as published by the Free 045 * Software Foundation. See the "COPYING" file for a copy of this license. 046 * <p> 047 * JMRI is distributed in the hope that it will be useful, but WITHOUT ANY 048 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR 049 * A PARTICULAR PURPOSE. See the GNU General Public License for more details. 050 * 051 * @param <E> the supported type of NamedBean 052 * @author Pete Cressman Copyright (C) 2009, 2010 053 */ 054public abstract class PickListModel<E extends NamedBean> extends BeanTableDataModel<E> { 055 056 protected ArrayList<E> _pickList; 057 protected String _name; 058 private JTable _table; // table using this model 059 protected TableRowSorter<PickListModel<E>> _sorter; 060 061 public static final int SNAME_COLUMN = 0; 062 public static final int UNAME_COLUMN = 1; 063 public static final int POSITION_COL = 2; 064 public static final ResourceBundle rb = ResourceBundle.getBundle("jmri.jmrit.beantable.BeanTableBundle"); 065 066 static HashMap<String, Integer> _listMap = new HashMap<String, Integer>(); 067 068 static public int getNumInstances(@Nonnull String type) { 069 Integer num = _listMap.get(type.toLowerCase()); 070 log.debug("getNumInstances of {} num={}", type, num); 071 if (num != null) { 072 return num; 073 } 074 return 0; 075 } 076 077 /** 078 * Default constructor makes a table sorted by System Name. 079 */ 080 public PickListModel() { 081 super(); 082 } 083 084 /** 085 * If table has been sorted table row no longer is the same as array index. 086 * 087 * @param index row of table 088 * @return bean at index or null if index is out of range 089 */ 090 @CheckForNull 091 public E getBeanAt(int index) { 092 if (index >= _pickList.size()) { 093 return null; 094 } 095 return _pickList.get(index); 096 } 097 098 public int getIndexOf(@Nonnull E bean) { 099 for (int i = 0; i < _pickList.size(); i++) { 100 if (_pickList.get(i).equals(bean)) { 101 return i; 102 } 103 } 104 return -1; 105 } 106 107 /** 108 * This method is overridden if only a limited set of the beans should be retrieved. 109 * @return the list of beans 110 */ 111 @Nonnull 112 public List<E> getBeanList() { 113 return _pickList; 114 } 115 116 /** 117 * override BeanTableDataModel only lists SystemName 118 */ 119 @Override 120 protected synchronized void updateNameList() { 121 makePickList(); 122 } 123 124 @CheckReturnValue 125 @Nonnull 126 protected SortedSet<E> getNamedBeanSet() { 127 return getManager().getNamedBeanSet(); 128 } 129 130 private void makePickList() { 131 // Don't know who is added or deleted so remove all name change listeners 132 if (_pickList != null) { 133 for (E e : _pickList) { 134 e.removePropertyChangeListener(this); 135 } 136 } 137 TreeSet<E> ts = new TreeSet<>(new NamedBeanComparator<>()); 138 ts.addAll(getNamedBeanSet()); 139 140 _pickList = new ArrayList<>(getNamedBeanSet().size()); 141 142 _pickList.addAll(ts); 143 // add name change listeners 144 for (E e : _pickList) { 145 e.addPropertyChangeListener(this); 146 } 147 log.debug("_pickList has {} beans", _pickList.size()); 148 } 149 150 /** {@inheritDoc} */ 151 @Override 152 @CheckForNull 153 public E getBySystemName(@Nonnull String name) { 154 return getManager().getBySystemName(name); 155 } 156 157 /** {@inheritDoc} */ 158 @Override 159 @CheckForNull 160 protected E getByUserName(@Nonnull String name) { 161 return getManager().getByUserName(name); 162 } 163 164 /** {@inheritDoc} */ 165 @Override 166 @Nonnull 167 abstract public Manager<E> getManager(); 168 169 /** 170 * Return bean with name given in parameter. Create if needed and possible. 171 * 172 * @param name the System name for the Bean. 173 * @return the Bean or null if not made. 174 * @throws IllegalArgumentException with reason why Bean cannot be created. 175 */ 176 @CheckForNull 177 abstract public E addBean(@Nonnull String name) throws IllegalArgumentException; 178 179 @CheckForNull 180 abstract public E addBean(@Nonnull String sysName, String userName) throws IllegalArgumentException; 181 182 /** 183 * Check if beans can be added by this model. 184 * 185 * @return true if model can create beans; false otherwise 186 */ 187 abstract public boolean canAddBean(); 188 189 // these BeanTableDataModel abstract methods not needed 190 /** {@inheritDoc} */ 191 @Override 192 protected String getMasterClassName() { 193 return "PickListModel"; 194 } 195 196 /** {@inheritDoc} */ 197 @Override 198 public void clickOn(E t) { 199 } 200 201 /** {@inheritDoc} */ 202 @Override 203 public Class<?> getColumnClass(int c) { 204 return String.class; 205 } 206 207 /** {@inheritDoc} */ 208 @Override 209 public int getColumnCount() { 210 return 2; 211 } 212 213 /** {@inheritDoc} */ 214 @Override 215 public String getColumnName(int c) { 216 if (c == SNAME_COLUMN) { 217 return Bundle.getMessage("ColumnSystemName"); 218 } else if (c == UNAME_COLUMN) { 219 return Bundle.getMessage("ColumnUserName"); 220 } 221 return ""; 222 } 223 224 /** {@inheritDoc} */ 225 @Override 226 public boolean isCellEditable(int r, int c) { 227 return false; 228 } 229 230 /** {@inheritDoc} */ 231 @Override 232 public int getRowCount() { 233 return _pickList.size(); 234 } 235 236 /** {@inheritDoc} */ 237 @Override 238 public Object getValueAt(int r, int c) { 239 // some error checking 240 if (r >= _pickList.size()) { 241 log.debug("row is greater than picklist size"); 242 return null; 243 } 244 if (c == SNAME_COLUMN) { 245 return _pickList.get(r).getSystemName(); 246 } else if (c == UNAME_COLUMN) { 247 return _pickList.get(r).getUserName(); 248 } 249 return null; 250 } 251 252 /** {@inheritDoc} */ 253 @Override 254 public void setValueAt(Object type, int r, int c) { 255 } 256 257 // these BeanTableDataModel abstract methods not needed 258 /** {@inheritDoc} */ 259 @Override 260 public String getValue(String systemName) { 261 return systemName; 262 } 263 264 public String getName() { 265 return _name; 266 } 267 268 /** {@inheritDoc} */ 269 @Override 270 protected String getBeanType() { 271 return _name; 272 } 273 274 /** 275 * Handle additions and deletions in the table and changes to beans within 276 * the table. 277 * 278 * @param e the change 279 */ 280 @Override 281 public void propertyChange(java.beans.PropertyChangeEvent e) { 282 if (e.getPropertyName().equals("length")) { 283 // a NamedBean added or deleted 284 makePickList(); 285 fireTableDataChanged(); 286 } 287 if (e.getSource() instanceof NamedBean) { 288 NamedBean bean = (NamedBean) e.getSource(); 289 for (int i = 0; i < _pickList.size(); i++) { 290 if (bean.equals(_pickList.get(i))) { 291 fireTableRowsUpdated(i, i); 292 break; 293 } 294 } 295 } 296 if (log.isDebugEnabled()) { 297 log.debug("propertyChange of \"{}\" for {}", e.getPropertyName(), e.getSource().toString()); 298 } 299 } 300 301 /** 302 * Make pick table, DND enabled. 303 * @return the table 304 */ 305 public JTable makePickTable() { 306 _sorter = new TableRowSorter<>(this); 307 _table = new JTable(this) { 308 /** 309 * Overridden to prevent empty cells from being selected 310 */ 311 @Override 312 public void changeSelection(int row, int col, boolean toggle, boolean extend) { 313 if (super.getValueAt(row, col) != null) { 314 super.changeSelection(row, col, toggle, extend); 315 } 316 } 317 }; 318 _sorter.setComparator(SNAME_COLUMN, new jmri.util.AlphanumComparator()); 319 _sorter.setComparator(UNAME_COLUMN, new jmri.util.AlphanumComparator()); 320 RowSorterUtil.setSortOrder(_sorter, SNAME_COLUMN, SortOrder.ASCENDING); 321 _table.setRowSorter(_sorter); 322 323 _table.setRowSelectionAllowed(true); 324 _table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 325 _table.setPreferredScrollableViewportSize(new java.awt.Dimension(250, _table.getRowHeight() * 7)); 326 _table.setDragEnabled(true); 327 _table.setTransferHandler(new DnDTableExportHandler()); 328 329 _table.getTableHeader().setReorderingAllowed(true); 330 _table.setColumnModel(new XTableColumnModel()); 331 _table.createDefaultColumnsFromModel(); 332 TableColumnModel columnModel = _table.getColumnModel(); 333 334 TableColumn sNameColumnT = columnModel.getColumn(SNAME_COLUMN); 335 sNameColumnT.setResizable(true); 336 sNameColumnT.setMinWidth(50); 337 //sNameColumnT.setMaxWidth(200); 338 339 TableColumn uNameColumnT = columnModel.getColumn(UNAME_COLUMN); 340 uNameColumnT.setResizable(true); 341 uNameColumnT.setMinWidth(100); 342 //uNameColumnT.setMaxWidth(300); 343 344 addMouseListenerToHeader(_table); 345 _table.setAutoCreateColumnsFromModel(false); 346 347 return _table; 348 } 349 350 public void makeSorter(@Nonnull JTable table) { 351 _sorter = new TableRowSorter<>(this); 352 _sorter.setComparator(SNAME_COLUMN, new jmri.util.AlphanumComparator()); 353 _sorter.setComparator(UNAME_COLUMN, new jmri.util.AlphanumComparator()); 354 RowSorterUtil.setSortOrder(_sorter, SNAME_COLUMN, SortOrder.ASCENDING); 355 table.setRowSorter(_sorter); 356 } 357 358 @Nonnull 359 public JTable getTable() { 360 return _table; 361 } 362 363 /** {@inheritDoc} */ 364 @Override 365 public void dispose() { 366 getManager().removePropertyChangeListener(this); 367 } 368 369 @Nonnull 370 public static PickListModel<Turnout> turnoutPickModelInstance() { 371 Integer num = _listMap.get("turnout"); 372 if (num != null) { 373 _listMap.put("turnout", num + 1); 374 } else { 375 _listMap.put("turnout", 1); 376 } 377 return new TurnoutPickModel(); 378 } 379 380 @Nonnull 381 public static PickListModel<Sensor> sensorPickModelInstance() { 382 Integer num = _listMap.get("sensor"); 383 if (num != null) { 384 _listMap.put("sensor", num + 1); 385 } else { 386 _listMap.put("sensor", 1); 387 } 388 return new SensorPickModel(); 389 } 390 391 @Nonnull 392 public static PickListModel<Sensor> multiSensorPickModelInstance() { 393 Integer num = _listMap.get("multisensor"); 394 if (num != null) { 395 _listMap.put("multisensor", num + 1); 396 } else { 397 _listMap.put("multisensor", 1); 398 } 399 return new MultiSensorPickModel(); 400 } 401 402 @Nonnull 403 public static PickListModel<SignalHead> signalHeadPickModelInstance() { 404 Integer num = _listMap.get("signalhead"); 405 if (num != null) { 406 _listMap.put("signalhead", num + 1); 407 } else { 408 _listMap.put("signalhead", 1); 409 } 410 return new SignalHeadPickModel(); 411 } 412 413 @Nonnull 414 public static PickListModel<SignalMast> signalMastPickModelInstance() { 415 Integer num = _listMap.get("signalmast"); 416 if (num != null) { 417 _listMap.put("signalmast", num + 1); 418 } else { 419 _listMap.put("signalmast", 1); 420 } 421 return new SignalMastPickModel(); 422 } 423 424 @Nonnull 425 public static PickListModel<Memory> memoryPickModelInstance() { 426 Integer num = _listMap.get("memory"); 427 if (num != null) { 428 _listMap.put("memory", num + 1); 429 } else { 430 _listMap.put("memory", 1); 431 } 432 return new MemoryPickModel(); 433 } 434 435 @Nonnull 436 public static PickListModel<GlobalVariable> globalVariablePickModelInstance() { 437 Integer num = _listMap.get("globalVariable"); 438 if (num != null) { 439 _listMap.put("globalVariable", num + 1); 440 } else { 441 _listMap.put("globalVariable", 1); 442 } 443 return new GlobalVariablePickModel(); 444 } 445 446 @Nonnull 447 public static PickListModel<NamedTable> namedTablePickModelInstance() { 448 Integer num = _listMap.get("namedTable"); 449 if (num != null) { 450 _listMap.put("namedTable", num + 1); 451 } else { 452 _listMap.put("namedTable", 1); 453 } 454 return new NamedTablePickModel(); 455 } 456 457 @Nonnull 458 public static PickListModel<Block> blockPickModelInstance() { 459 Integer num = _listMap.get("block"); 460 if (num != null) { 461 _listMap.put("block", num + 1); 462 } else { 463 _listMap.put("block", 1); 464 } 465 return new BlockPickModel(); 466 } 467 468 @Nonnull 469 public static PickListModel<Reporter> reporterPickModelInstance() { 470 Integer num = _listMap.get("reporter"); 471 if (num != null) { 472 _listMap.put("reporter", num + 1); 473 } else { 474 _listMap.put("reporter", 1); 475 } 476 return new ReporterPickModel(); 477 } 478 479 @Nonnull 480 public static PickListModel<Light> lightPickModelInstance() { 481 Integer num = _listMap.get("light"); 482 if (num != null) { 483 _listMap.put("light", num + 1); 484 } else { 485 _listMap.put("light", 1); 486 } 487 return new LightPickModel(); 488 } 489 490 @Nonnull 491 public static PickListModel<OBlock> oBlockPickModelInstance() { 492 Integer num = _listMap.get("oBlock"); 493 if (num != null) { 494 _listMap.put("oBlock", num + 1); 495 } else { 496 _listMap.put("oBlock", 1); 497 } 498 return new OBlockPickModel(); 499 } 500 501 @Nonnull 502 public static PickListModel<Warrant> warrantPickModelInstance() { 503 Integer num = _listMap.get("warrant"); 504 if (num != null) { 505 _listMap.put("warrant", num + 1); 506 } else { 507 _listMap.put("warrant", 1); 508 } 509 return new WarrantPickModel(); 510 } 511 512 @Nonnull 513 public static PickListModel<DestinationPoints> entryExitPickModelInstance() { 514 Integer num = _listMap.get("entryExit"); 515 if (num != null) { 516 _listMap.put("entryExit", num + 1); 517 } else { 518 _listMap.put("entryExit", 1); 519 } 520 return new EntryExitPickModel(); 521 } 522 523 public static PickListModel<Logix> logixPickModelInstance() { 524 Integer num = _listMap.get("logix"); 525 if (num != null) { 526 _listMap.put("logix", num + 1); 527 } else { 528 _listMap.put("logix", 1); 529 } 530 return new LogixPickModel(); 531 } 532 533 @Nonnull 534 public static PickListModel<Audio> audioPickModelInstance() { 535 Integer num = _listMap.get("audio"); 536 if (num != null) { 537 _listMap.put("audio", num + 1); 538 } else { 539 _listMap.put("audio", 1); 540 } 541 return new AudioPickModel(); 542 } 543 544 private final static Logger log = LoggerFactory.getLogger(PickListModel.class); 545 546 static class TurnoutPickModel extends PickListModel<Turnout> { 547 548 TurnoutManager manager = InstanceManager.turnoutManagerInstance(); 549 550 TurnoutPickModel() { 551 _name = rb.getString("TitleTurnoutTable"); 552 } 553 554 /** {@inheritDoc} */ 555 @Override 556 @Nonnull 557 public Manager<Turnout> getManager() { 558 manager = InstanceManager.turnoutManagerInstance(); 559 return manager; 560 } 561 562 /** {@inheritDoc} */ 563 @Override 564 public Turnout addBean(@Nonnull String name) throws IllegalArgumentException { 565 return manager.provideTurnout(name); 566 } 567 568 /** {@inheritDoc} */ 569 @Override 570 public Turnout addBean(@Nonnull String sysName, String userName) throws IllegalArgumentException { 571 return manager.newTurnout(sysName, userName); 572 } 573 574 /** {@inheritDoc} */ 575 @Override 576 public boolean canAddBean() { 577 return true; 578 } 579 } 580 581 static class SensorPickModel extends PickListModel<Sensor> { 582 583 SensorManager manager = InstanceManager.getDefault(SensorManager.class); 584 585 SensorPickModel() { 586 _name = rb.getString("TitleSensorTable"); 587 } 588 589 /** {@inheritDoc} */ 590 @Override 591 @Nonnull 592 public Manager<Sensor> getManager() { 593 manager = InstanceManager.sensorManagerInstance(); 594 return manager; 595 } 596 597 /** {@inheritDoc} */ 598 @Override 599 public Sensor addBean(@Nonnull String name) throws IllegalArgumentException { 600 return manager.provideSensor(name); 601 } 602 603 /** {@inheritDoc} */ 604 @Override 605 public Sensor addBean(@Nonnull String sysName, String userName) throws IllegalArgumentException { 606 return manager.newSensor(sysName, userName); 607 } 608 609 /** {@inheritDoc} */ 610 @Override 611 public boolean canAddBean() { 612 return true; 613 } 614 } 615 616 static class MultiSensorPickModel extends SensorPickModel { 617 618 private final HashMap<Integer, String> _position = new HashMap<>(); 619 620 MultiSensorPickModel() { 621 super(); 622 } 623 624 /** {@inheritDoc} */ 625 @Override 626 public Object getValueAt(int r, int c) { 627 if (c == POSITION_COL) { 628 return _position.get(r); 629 } 630 return super.getValueAt(r, c); 631 } 632 633 /** {@inheritDoc} */ 634 @Override 635 public void setValueAt(Object type, int r, int c) { 636 if (c == POSITION_COL) { 637 _position.put(r, (String) type); 638 } 639 } 640 } 641 642 static class SignalHeadPickModel extends PickListModel<SignalHead> { 643 644 SignalHeadManager manager = InstanceManager.getDefault(SignalHeadManager.class); 645 646 SignalHeadPickModel() { 647 _name = rb.getString("TitleSignalTable"); 648 } 649 650 /** {@inheritDoc} */ 651 @Override 652 @Nonnull 653 public Manager<SignalHead> getManager() { 654 manager = InstanceManager.getDefault(SignalHeadManager.class); 655 return manager; 656 } 657 658 /** {@inheritDoc} */ 659 @Override 660 public SignalHead addBean(@Nonnull String name) { 661 return manager.getSignalHead(name); 662 } 663 664 /** {@inheritDoc} */ 665 @Override 666 public SignalHead addBean(@Nonnull String sysName, String userName) { 667 SignalHead sh = manager.getSignalHead(userName); 668 if (sh == null) { 669 sh = manager.getSignalHead(sysName); 670 } 671 return sh; 672 } 673 674 /** {@inheritDoc} */ 675 @Override 676 public boolean canAddBean() { 677 return false; 678 } 679 } 680 681 static class SignalMastPickModel extends PickListModel<SignalMast> { 682 683 SignalMastManager manager = InstanceManager.getDefault(SignalMastManager.class); 684 685 SignalMastPickModel() { 686 _name = rb.getString("TitleSignalMastTable"); 687 } 688 689 /** {@inheritDoc} */ 690 @Override 691 @Nonnull 692 public Manager<SignalMast> getManager() { 693 manager = InstanceManager.getDefault(SignalMastManager.class); 694 return manager; 695 } 696 697 /** {@inheritDoc} */ 698 @Override 699 public SignalMast addBean(@Nonnull String name) throws IllegalArgumentException { 700 return manager.provideSignalMast(name); 701 } 702 703 /** {@inheritDoc} */ 704 @Override 705 public SignalMast addBean(@Nonnull String sysName, String userName) throws IllegalArgumentException { 706 SignalMast sm = manager.getSignalMast(userName); 707 if (sm == null) { 708 sm = manager.provideSignalMast(sysName); 709 } 710 return sm; 711 } 712 713 /** {@inheritDoc} */ 714 @Override 715 public boolean canAddBean() { 716 return false; 717 } 718 } 719 720 static class MemoryPickModel extends PickListModel<Memory> { 721 722 MemoryManager manager = InstanceManager.memoryManagerInstance(); 723 724 MemoryPickModel() { 725 _name = rb.getString("TitleMemoryTable"); 726 } 727 728 /** {@inheritDoc} */ 729 @Override 730 @Nonnull 731 public Manager<Memory> getManager() { 732 manager = InstanceManager.memoryManagerInstance(); 733 return manager; 734 } 735 736 /** {@inheritDoc} */ 737 @Override 738 public Memory addBean(@Nonnull String name) throws IllegalArgumentException { 739 return manager.provideMemory(name); 740 } 741 742 /** {@inheritDoc} */ 743 @Override 744 public Memory addBean(@Nonnull String sysName, String userName) throws IllegalArgumentException { 745 return manager.newMemory(sysName, userName); 746 } 747 748 /** {@inheritDoc} */ 749 @Override 750 public boolean canAddBean() { 751 return true; 752 } 753 } 754 755 static class GlobalVariablePickModel extends PickListModel<GlobalVariable> { 756 757 GlobalVariableManager manager = InstanceManager.getDefault(GlobalVariableManager.class); 758 759 GlobalVariablePickModel() { 760 _name = rb.getString("TitleLogixNGGlobalVariablesTable"); 761 } 762 763 /** {@inheritDoc} */ 764 @Override 765 @Nonnull 766 public Manager<GlobalVariable> getManager() { 767 manager = InstanceManager.getDefault(GlobalVariableManager.class); 768 return manager; 769 } 770 771 /** {@inheritDoc} */ 772 @Override 773 public GlobalVariable addBean(@Nonnull String name) throws IllegalArgumentException { 774 throw new UnsupportedOperationException("Not supported"); 775 } 776 777 /** {@inheritDoc} */ 778 @Override 779 public GlobalVariable addBean(@Nonnull String sysName, String userName) throws IllegalArgumentException { 780 throw new UnsupportedOperationException("Not supported"); 781 } 782 783 /** {@inheritDoc} */ 784 @Override 785 public boolean canAddBean() { 786 return false; 787 } 788 } 789 790 static class NamedTablePickModel extends PickListModel<NamedTable> { 791 792 NamedTableManager manager = InstanceManager.getDefault(NamedTableManager.class); 793 794 NamedTablePickModel() { 795 _name = rb.getString("TitleLogixNGTableTable"); 796 } 797 798 /** {@inheritDoc} */ 799 @Override 800 @Nonnull 801 public Manager<NamedTable> getManager() { 802 manager = InstanceManager.getDefault(NamedTableManager.class); 803 return manager; 804 } 805 806 /** {@inheritDoc} */ 807 @Override 808 public NamedTable addBean(@Nonnull String name) throws IllegalArgumentException { 809 throw new UnsupportedOperationException("Not supported"); 810 } 811 812 /** {@inheritDoc} */ 813 @Override 814 public NamedTable addBean(@Nonnull String sysName, String userName) throws IllegalArgumentException { 815 throw new UnsupportedOperationException("Not supported"); 816 } 817 818 /** {@inheritDoc} */ 819 @Override 820 public boolean canAddBean() { 821 return false; 822 } 823 } 824 825 static class BlockPickModel extends PickListModel<Block> { 826 827 BlockManager manager = InstanceManager.getDefault(BlockManager.class); 828 829 BlockPickModel() { 830 _name = rb.getString("TitleBlockTable"); 831 } 832 833 /** {@inheritDoc} */ 834 @Override 835 @Nonnull 836 public Manager<Block> getManager() { 837 manager = InstanceManager.getDefault(BlockManager.class); 838 return manager; 839 } 840 841 /** {@inheritDoc} */ 842 @Override 843 public Block addBean(@Nonnull String name) throws IllegalArgumentException { 844 return manager.provideBlock(name); 845 } 846 847 /** {@inheritDoc} */ 848 @Override 849 public Block addBean(@Nonnull String sysName, String userName) throws IllegalArgumentException { 850 return manager.createNewBlock(sysName, userName); 851 } 852 853 /** {@inheritDoc} */ 854 @Override 855 public boolean canAddBean() { 856 return true; 857 } 858 } 859 860 static class ReporterPickModel extends PickListModel<Reporter> { 861 862 ReporterManager manager = InstanceManager.getDefault(ReporterManager.class); 863 864 ReporterPickModel() { 865 _name = rb.getString("TitleReporterTable"); 866 } 867 868 /** {@inheritDoc} */ 869 @Override 870 @Nonnull 871 public Manager<Reporter> getManager() { 872 manager = InstanceManager.getDefault(ReporterManager.class); 873 return manager; 874 } 875 876 /** {@inheritDoc} */ 877 @Override 878 public Reporter addBean(@Nonnull String name) throws IllegalArgumentException { 879 return manager.provideReporter(name); 880 } 881 882 /** {@inheritDoc} */ 883 @Override 884 public Reporter addBean(@Nonnull String sysName, String userName) throws IllegalArgumentException { 885 return manager.newReporter(sysName, userName); 886 } 887 888 /** {@inheritDoc} */ 889 @Override 890 public boolean canAddBean() { 891 return true; 892 } 893 } 894 895 static class LightPickModel extends PickListModel<Light> { 896 897 LightManager manager = InstanceManager.lightManagerInstance(); 898 899 LightPickModel() { 900 _name = rb.getString("TitleLightTable"); 901 } 902 903 /** {@inheritDoc} */ 904 @Override 905 @Nonnull 906 public Manager<Light> getManager() { 907 manager = InstanceManager.lightManagerInstance(); 908 return manager; 909 } 910 911 /** {@inheritDoc} */ 912 @Override 913 public Light addBean(@Nonnull String name) throws IllegalArgumentException { 914 return manager.provideLight(name); 915 } 916 917 /** {@inheritDoc} */ 918 @Override 919 public Light addBean(@Nonnull String sysName, String userName) throws IllegalArgumentException { 920 return manager.newLight(sysName, userName); 921 } 922 923 /** {@inheritDoc} */ 924 @Override 925 public boolean canAddBean() { 926 return true; 927 } 928 } 929 930 static class OBlockPickModel extends PickListModel<OBlock> { 931 932 OBlockManager manager = InstanceManager.getDefault(OBlockManager.class); 933 934 OBlockPickModel() { 935 _name = rb.getString("TitleBlockTable"); 936 } 937 938 /** {@inheritDoc} */ 939 @Override 940 @Nonnull 941 public Manager<OBlock> getManager() { 942 manager = InstanceManager.getDefault(OBlockManager.class); 943 return manager; 944 } 945 946 /** {@inheritDoc} */ 947 @Override 948 public OBlock addBean(@Nonnull String name) throws IllegalArgumentException { 949 return manager.provideOBlock(name); 950 } 951 952 /** {@inheritDoc} */ 953 @Override 954 public OBlock addBean(@Nonnull String sysName, String userName) { 955 return manager.createNewOBlock(sysName, userName); 956 } 957 958 /** {@inheritDoc} */ 959 @Override 960 public boolean canAddBean() { 961 return true; 962 } 963 } 964 965 static class WarrantPickModel extends PickListModel<Warrant> { 966 967 WarrantManager manager = InstanceManager.getDefault(WarrantManager.class); 968 969 WarrantPickModel() { 970 _name = rb.getString("TitleWarrantTable"); 971 } 972 973 /** {@inheritDoc} */ 974 @Override 975 @Nonnull 976 public Manager<Warrant> getManager() { 977 manager = InstanceManager.getDefault(WarrantManager.class); 978 return manager; 979 } 980 981 /** {@inheritDoc} */ 982 @Override 983 public Warrant addBean(@Nonnull String name) throws IllegalArgumentException { 984 return manager.provideWarrant(name); 985 } 986 987 /** {@inheritDoc} */ 988 @Override 989 public Warrant addBean(@Nonnull String sysName, String userName) { 990 return manager.createNewWarrant(sysName, userName, false, 0); 991 } 992 993 /** {@inheritDoc} */ 994 @Override 995 public boolean canAddBean() { 996 return false; 997 } 998 } 999 1000 static class EntryExitPickModel extends PickListModel<DestinationPoints> { 1001 1002 EntryExitPairs manager = InstanceManager.getDefault(EntryExitPairs.class); 1003 1004 EntryExitPickModel() { 1005 _name = rb.getString("TitleEntryExitTable"); 1006 } 1007 1008 /** {@inheritDoc} */ 1009 @Override 1010 @Nonnull 1011 public Manager<DestinationPoints> getManager() { 1012 manager = InstanceManager.getDefault(EntryExitPairs.class); 1013 return manager; 1014 } 1015 1016 /** {@inheritDoc} */ 1017 @Override 1018 public DestinationPoints addBean(@Nonnull String name) { 1019 return null; 1020 } 1021 1022 /** {@inheritDoc} */ 1023 @Override 1024 public DestinationPoints addBean(@Nonnull String sysName, String userName) { 1025 return null; 1026 } 1027 1028 /** {@inheritDoc} */ 1029 @Override 1030 public boolean canAddBean() { 1031 return false; 1032 } 1033 1034 /** {@inheritDoc} */ 1035 @Override 1036 public String getColumnName(int c) { 1037 if (c == SNAME_COLUMN) { 1038 return "Unique Id"; 1039 } else if (c == UNAME_COLUMN) { 1040 return Bundle.getMessage("ColumnUserName"); 1041 } 1042 return ""; 1043 } 1044 } 1045 1046 static class LogixPickModel extends PickListModel<Logix> { 1047 1048 LogixManager manager; 1049 1050 LogixPickModel() { 1051 _name = rb.getString("TitleLogixTable"); 1052 } 1053 1054 /** {@inheritDoc} */ 1055 @Override 1056 @Nonnull 1057 public Manager<Logix> getManager() { 1058 manager = InstanceManager.getDefault(LogixManager.class); 1059 return manager; 1060 } 1061 1062 /** {@inheritDoc} */ 1063 @Override 1064 public Logix addBean(@Nonnull String name) { 1065 return null; 1066 } 1067 1068 /** {@inheritDoc} */ 1069 @Override 1070 public Logix addBean(@Nonnull String sysName, String userName) { 1071 return null; 1072 } 1073 1074 /** {@inheritDoc} */ 1075 @Override 1076 public boolean canAddBean() { 1077 return false; 1078 } 1079 } 1080 1081 static class AudioPickModel extends PickListModel<Audio> { 1082 1083 AudioManager manager = InstanceManager.getDefault(AudioManager.class); 1084 1085 AudioPickModel() { 1086 _name = rb.getString("TitleAudioTable"); 1087 } 1088 1089 /** {@inheritDoc} */ 1090 @Override 1091 @Nonnull 1092 public Manager<Audio> getManager() { 1093 manager = InstanceManager.getDefault(AudioManager.class); 1094 return manager; 1095 } 1096 1097 @CheckReturnValue 1098 @Nonnull 1099 @Override 1100 protected SortedSet<Audio> getNamedBeanSet() { 1101 java.util.function.Predicate<Audio> filter = (bean) -> { return bean.getSubType() == Audio.SOURCE; }; 1102 TreeSet<Audio> namedBeanSet = new TreeSet<>(new NamedBeanComparator<>()); 1103 namedBeanSet.addAll(manager.getNamedBeanSet().stream().filter(filter) 1104 .collect(java.util.stream.Collectors.toSet())); 1105 return Collections.unmodifiableSortedSet(namedBeanSet); 1106 } 1107 1108 /** {@inheritDoc} */ 1109 @Override 1110 public Audio addBean(@Nonnull String name) throws IllegalArgumentException { 1111 try { 1112 return manager.provideAudio(name); 1113 } catch (AudioException e) { 1114 throw new IllegalArgumentException(e); 1115 } 1116 } 1117 1118 /** {@inheritDoc} */ 1119 @Override 1120 public Audio addBean(@Nonnull String sysName, String userName) throws IllegalArgumentException { 1121 try { 1122 return manager.newAudio(sysName, userName); 1123 } catch (AudioException e) { 1124 throw new IllegalArgumentException(e); 1125 } 1126 } 1127 1128 /** {@inheritDoc} */ 1129 @Override 1130 public boolean canAddBean() { 1131 return true; 1132 } 1133 } 1134 1135}