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}