001package jmri.jmrit.roster.swing.rostergroup;
002
003import javax.swing.JTable;
004import javax.swing.JTextField;
005import jmri.jmrit.roster.Roster;
006import jmri.jmrit.roster.RosterEntry;
007
008/**
009 * Table data model for display of Rosters entries to a specific Roster Group.
010 * <p>
011 * Any desired ordering, etc, is handled outside this class.
012 * <p>
013 * The initial implementation doesn't automatically update when roster entries
014 * change, it only allows the setting of a roster entry, to a roster group.
015 * Based Upon RosterTableModel
016 *
017 * @author Bob Jacobsen Copyright (C) 2009
018 * @author Kevin Dickerson Copyright (C) 2009
019 * @since 2.7.5
020 */
021public class RosterGroupTableModel extends javax.swing.table.AbstractTableModel {
022
023    static final int IDCOL = 0;
024    static final int ROADNUMBERCOL = 1;
025    static final int ROADNAMECOL = 2;
026    static final int MFGCOL = 3;
027    static final int OWNERCOL = 4;
028    static final int ADDTOGROUPCOL = 5;
029
030    String group = "RosterGroup:";
031
032    static final int NUMCOL = ADDTOGROUPCOL + 1;
033
034    @Override
035    public int getRowCount() {
036        return Roster.getDefault().numEntries();
037    }
038
039    @Override
040    public int getColumnCount() {
041        return NUMCOL;
042    }
043
044    @Override
045    public String getColumnName(int col) {
046        switch (col) {
047            case IDCOL:
048                return Bundle.getMessage("FieldID");
049            case ROADNUMBERCOL:
050                return Bundle.getMessage("FieldRoadNumber");
051            case ROADNAMECOL:
052                return Bundle.getMessage("FieldRoadName");
053            case MFGCOL:
054                return Bundle.getMessage("FieldManufacturer");
055            case ADDTOGROUPCOL:
056                return Bundle.getMessage("Include");
057            case OWNERCOL:
058                return Bundle.getMessage("FieldOwner");
059            default:
060                return "<UNKNOWN>"; // flags unforeseen case, NOI18N
061        }
062    }
063
064    public int getPreferredWidth(int col) {
065        switch (col) {
066            case IDCOL:
067                return new JTextField(10).getPreferredSize().width;
068            case ROADNUMBERCOL:
069                return 75;
070            case ROADNAMECOL:
071            case OWNERCOL:
072                return new JTextField(20).getPreferredSize().width;
073            case ADDTOGROUPCOL: // not actually used due to the configureTable, setColumnToHoldButton, configureButton
074                return 50;
075            case MFGCOL:
076                return new JTextField(5).getPreferredSize().width;
077            default:
078                //log.warn("Unexpected column in getPreferredWidth: "+col);
079                return new JTextField(8).getPreferredSize().width;
080        }
081    }
082
083    @Override
084    public Class<?> getColumnClass(int col) {
085        if (col == ADDTOGROUPCOL) {
086            return Boolean.class;
087        } else {
088            return String.class;
089        }
090    }
091
092    /**
093     * This implementation can't edit the values yet
094     */
095    @Override
096    public boolean isCellEditable(int row, int col) {
097        switch (col) {
098            case ADDTOGROUPCOL:
099                return true;
100            default:
101                return false;
102        }
103    }
104
105    /**
106     * Provides the empty String if attribute doesn't exist.
107     */
108    @Override
109    public Object getValueAt(int row, int col) {
110        // get roster entry for row
111        RosterEntry re = Roster.getDefault().getEntry(row);
112
113        switch (col) {
114            case IDCOL:
115                return re.getId();
116            case ROADNUMBERCOL:
117                return re.getRoadNumber();
118            case ROADNAMECOL:
119                return re.getRoadName();
120            case MFGCOL:
121                return re.getMfg();
122            case OWNERCOL:
123                return re.getOwner();
124            case ADDTOGROUPCOL:
125                if (group == null) {
126                    return false;
127                } else {
128                    if (re.getAttribute(group) != null) {
129                        return true;
130                    } else {
131                        return false;
132                    }
133                }
134            default:
135                return "<UNKNOWN>";
136        }
137    }
138
139    public void configureTable(JTable table) {
140        // allow reordering of the columns
141        table.getTableHeader().setReorderingAllowed(true);
142
143        // have to shut off autoResizeMode to get horizontal scroll to work (JavaSwing p 541)
144        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
145
146        // resize columns as requested
147        for (int i = 0; i < table.getColumnCount(); i++) {
148            int width = getPreferredWidth(i);
149            table.getColumnModel().getColumn(i).setPreferredWidth(width);
150        }
151        table.sizeColumnsToFit(-1);
152        //setUpRosterIdCol(table.getColumnModel().getColumn(3));
153        //configAddToRosterColumn(table); Remarked out until the code for the add to roster has been completed
154
155    }
156
157    synchronized public void dispose() {
158        //This needs to be sorted later.
159        //getManager().removePropertyChangeListener(this);
160    }
161
162    @Override
163    public void setValueAt(Object value, int row, int col) {
164        RosterEntry re = Roster.getDefault().getEntry(row);
165        if ((col == ADDTOGROUPCOL) && (!group.equals("RosterGroup:"))) {
166            if (value.toString().equals("true")) {
167                re.putAttribute(group, "yes");
168            } else {
169                re.deleteAttribute(group);
170            }
171            re.updateFile();
172            Roster.getDefault().writeRoster();
173
174        }
175    }
176
177    public void setGroup(String grp) {
178        group = grp;
179    }
180
181    public void getGroupEnabled(RosterEntry re) {
182
183    }
184
185    // private final static Logger log = LoggerFactory.getLogger(RosterGroupTableModel.class);
186}