use of jmri.Turnout in project JMRI by JMRI.
the class AbstractTurnoutServer method closeTurnout.
public void closeTurnout(String turnoutName) {
// load address from switchAddrTextField
try {
if (!turnouts.containsKey(turnoutName)) {
// enforce that initTurnout must be called before moving a
// turnout
sendErrorStatus(turnoutName);
return;
}
Turnout turnout = InstanceManager.turnoutManagerInstance().getTurnout(turnoutName);
if (turnout == null) {
log.error("Turnout {} is not available", turnoutName);
} else {
log.debug("about to command CLOSED");
// and set commanded state to CLOSED
turnout.setCommandedState(Turnout.CLOSED);
}
} catch (IOException ex) {
log.error("Error closing turnout", ex);
}
}
use of jmri.Turnout in project JMRI by JMRI.
the class Maintenance method findOrphansPressed.
/**
* Find orphaned elements in the various Manager Objects.
*
* @param parent Frame to check
*/
public static void findOrphansPressed(Frame parent) {
Vector<String> display = new Vector<String>();
Vector<String> names = new Vector<String>();
Iterator<String> iter = InstanceManager.sensorManagerInstance().getSystemNameList().iterator();
while (iter.hasNext()) {
String name = iter.next();
if (!search(name, null) && !name.equals("ISCLOCKRUNNING")) {
display.add(MessageFormat.format(rbm.getString("OrphanName"), (Object[]) getTypeAndNames(name)));
names.add(name);
}
}
iter = InstanceManager.turnoutManagerInstance().getSystemNameList().iterator();
while (iter.hasNext()) {
String name = iter.next();
if (!search(name, null)) {
display.add(MessageFormat.format(rbm.getString("OrphanName"), (Object[]) getTypeAndNames(name)));
names.add(name);
}
}
iter = InstanceManager.getDefault(jmri.SignalHeadManager.class).getSystemNameList().iterator();
while (iter.hasNext()) {
String name = iter.next();
if (!search(name, null)) {
display.add(MessageFormat.format(rbm.getString("OrphanName"), (Object[]) getTypeAndNames(name)));
names.add(name);
}
}
iter = InstanceManager.lightManagerInstance().getSystemNameList().iterator();
while (iter.hasNext()) {
String name = iter.next();
if (!search(name, null)) {
display.add(MessageFormat.format(rbm.getString("OrphanName"), (Object[]) getTypeAndNames(name)));
names.add(name);
}
}
iter = InstanceManager.getDefault(jmri.ConditionalManager.class).getSystemNameList().iterator();
while (iter.hasNext()) {
String name = iter.next();
if (!search(name, null)) {
display.add(MessageFormat.format(rbm.getString("OrphanName"), (Object[]) getTypeAndNames(name)));
names.add(name);
}
}
iter = InstanceManager.getDefault(jmri.SectionManager.class).getSystemNameList().iterator();
while (iter.hasNext()) {
String name = iter.next();
if (!search(name, null)) {
display.add(MessageFormat.format(rbm.getString("OrphanName"), (Object[]) getTypeAndNames(name)));
names.add(name);
}
}
iter = InstanceManager.getDefault(jmri.BlockManager.class).getSystemNameList().iterator();
while (iter.hasNext()) {
String name = iter.next();
if (!search(name, null)) {
display.add(MessageFormat.format(rbm.getString("OrphanName"), (Object[]) getTypeAndNames(name)));
names.add(name);
}
}
DefaultListModel<String> listModel = new DefaultListModel<String>();
for (int i = 0; i < display.size(); i++) {
listModel.addElement(display.get(i));
}
JList<String> list = new JList<String>(listModel);
list.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
JButton button = new JButton(Bundle.getMessage("ButtonDelete"));
button.setToolTipText(rbm.getString("OrphanDeleteHint"));
class SearchListener implements ActionListener {
JList<String> list;
Vector<String> n;
SearchListener(JList<String> list, Vector<String> name) {
this.list = list;
this.n = name;
}
@Override
public void actionPerformed(ActionEvent e) {
int index = list.getMaxSelectionIndex();
if (index < 0) {
javax.swing.JOptionPane.showMessageDialog(null, rbm.getString("OrphanDeleteHint"), rbm.getString("DeleteTitle"), javax.swing.JOptionPane.INFORMATION_MESSAGE);
return;
}
int min = list.getMinSelectionIndex();
DefaultListModel<String> model = (DefaultListModel<String>) list.getModel();
while (index >= min) {
String[] names = getTypeAndNames(n.get(index));
if (names[0].equals("Sensor")) {
// NOI18N
Sensor s = InstanceManager.sensorManagerInstance().getBySystemName(names[2]);
if (s == null) {
s = InstanceManager.sensorManagerInstance().getBySystemName(names[1]);
}
InstanceManager.sensorManagerInstance().deregister(s);
} else if (names[0].equals("Turnout")) {
// NOI18N
Turnout t = InstanceManager.turnoutManagerInstance().getBySystemName(names[2]);
if (t == null) {
t = InstanceManager.turnoutManagerInstance().getBySystemName(names[1]);
}
InstanceManager.turnoutManagerInstance().deregister(t);
} else if (names[0].equals("SignalHead")) {
// NOI18N
SignalHead sh = InstanceManager.getDefault(jmri.SignalHeadManager.class).getBySystemName(names[2]);
if (sh == null) {
sh = InstanceManager.getDefault(jmri.SignalHeadManager.class).getBySystemName(names[1]);
}
InstanceManager.getDefault(jmri.SignalHeadManager.class).deregister(sh);
} else if (names[0].equals("Light")) {
// NOI18N
Light l = InstanceManager.lightManagerInstance().getBySystemName(names[2]);
if (l == null) {
l = InstanceManager.lightManagerInstance().getBySystemName(names[1]);
}
InstanceManager.lightManagerInstance().deregister(l);
} else if (names[0].equals("Conditional")) {
// NOI18N
Conditional c = InstanceManager.getDefault(jmri.ConditionalManager.class).getBySystemName(names[2]);
if (c == null) {
c = InstanceManager.getDefault(jmri.ConditionalManager.class).getBySystemName(names[1]);
}
InstanceManager.getDefault(jmri.ConditionalManager.class).deregister(c);
} else if (names[0].equals("Section")) {
// NOI18N
jmri.Section sec = InstanceManager.getDefault(jmri.SectionManager.class).getBySystemName(names[2]);
if (sec == null) {
sec = InstanceManager.getDefault(jmri.SectionManager.class).getBySystemName(names[1]);
}
InstanceManager.getDefault(jmri.SectionManager.class).deregister(sec);
} else if (names[0].equals("Block")) {
// NOI18N
jmri.Block b = InstanceManager.getDefault(jmri.BlockManager.class).getBySystemName(names[2]);
if (b == null) {
b = InstanceManager.getDefault(jmri.BlockManager.class).getBySystemName(names[1]);
}
InstanceManager.getDefault(jmri.BlockManager.class).deregister(b);
}
model.remove(index);
n.remove(index);
index--;
}
index++;
if (index >= model.getSize()) {
index = model.getSize() - 1;
}
if (index >= 0) {
list.setSelectedIndex(index);
}
}
}
JScrollPane scrollPane = new JScrollPane(list);
button.addActionListener(new SearchListener(list, names));
button.setMaximumSize(button.getPreferredSize());
makeDialog(scrollPane, button, parent, rbm.getString("OrphanTitle"));
}
use of jmri.Turnout in project JMRI by JMRI.
the class TurnoutTableAction method createModel.
/**
* Create the JTable DataModel, along with the changes for the specific case
* of Turnouts.
*/
@Override
protected void createModel() {
// store the terminology
closedText = turnManager.getClosedText();
thrownText = turnManager.getThrownText();
// load graphic state column display preference
// from apps/GuiLafConfigPane.java
_graphicState = InstanceManager.getDefault(GuiLafPreferencesManager.class).isGraphicTableState();
// create the data model object that drives the table
// note that this is a class creation, and very long
m = new BeanTableDataModel() {
@Override
public int getColumnCount() {
return DIVERGCOL + 1;
}
@Override
public String getColumnName(int col) {
if (col == INVERTCOL) {
return Bundle.getMessage("Inverted");
} else if (col == LOCKCOL) {
return Bundle.getMessage("Locked");
} else if (col == KNOWNCOL) {
return Bundle.getMessage("Feedback");
} else if (col == MODECOL) {
return Bundle.getMessage("ModeLabel");
} else if (col == SENSOR1COL) {
return Bundle.getMessage("BlockSensor") + "1";
} else if (col == SENSOR2COL) {
return Bundle.getMessage("BlockSensor") + "2";
} else if (col == OPSONOFFCOL) {
return Bundle.getMessage("TurnoutAutomationMenu");
} else if (col == OPSEDITCOL) {
return "";
} else if (col == LOCKOPRCOL) {
return Bundle.getMessage("LockMode");
} else if (col == LOCKDECCOL) {
return Bundle.getMessage("Decoder");
} else if (col == DIVERGCOL) {
return Bundle.getMessage("ThrownSpeed");
} else if (col == STRAIGHTCOL) {
return Bundle.getMessage("ClosedSpeed");
} else if (col == EDITCOL) {
return "";
} else {
return super.getColumnName(col);
}
}
@Override
public Class<?> getColumnClass(int col) {
if (col == INVERTCOL) {
return Boolean.class;
} else if (col == LOCKCOL) {
return Boolean.class;
} else if (col == KNOWNCOL) {
return String.class;
} else if (col == MODECOL) {
return JComboBox.class;
} else if (col == SENSOR1COL) {
return JComboBox.class;
} else if (col == SENSOR2COL) {
return JComboBox.class;
} else if (col == OPSONOFFCOL) {
return JComboBox.class;
} else if (col == OPSEDITCOL) {
return JButton.class;
} else if (col == EDITCOL) {
return JButton.class;
} else if (col == LOCKOPRCOL) {
return JComboBox.class;
} else if (col == LOCKDECCOL) {
return JComboBox.class;
} else if (col == DIVERGCOL) {
return JComboBox.class;
} else if (col == STRAIGHTCOL) {
return JComboBox.class;
} else if (col == VALUECOL && _graphicState) {
// use an image to show turnout state
return JLabel.class;
} else {
return super.getColumnClass(col);
}
}
@Override
public int getPreferredWidth(int col) {
switch(col) {
case INVERTCOL:
return new JTextField(6).getPreferredSize().width;
case LOCKCOL:
return new JTextField(6).getPreferredSize().width;
case LOCKOPRCOL:
return new JTextField(10).getPreferredSize().width;
case LOCKDECCOL:
return new JTextField(10).getPreferredSize().width;
case KNOWNCOL:
return new JTextField(10).getPreferredSize().width;
case MODECOL:
return new JTextField(10).getPreferredSize().width;
case SENSOR1COL:
return new JTextField(5).getPreferredSize().width;
case SENSOR2COL:
return new JTextField(5).getPreferredSize().width;
case OPSONOFFCOL:
return new JTextField(14).getPreferredSize().width;
case OPSEDITCOL:
return new JTextField(7).getPreferredSize().width;
case EDITCOL:
return new JTextField(7).getPreferredSize().width;
case DIVERGCOL:
return new JTextField(14).getPreferredSize().width;
case STRAIGHTCOL:
return new JTextField(14).getPreferredSize().width;
default:
super.getPreferredWidth(col);
}
return super.getPreferredWidth(col);
}
@Override
public boolean isCellEditable(int row, int col) {
String name = sysNameList.get(row);
TurnoutManager manager = turnManager;
Turnout t = manager.getBySystemName(name);
if (col == INVERTCOL) {
return t.canInvert();
} else if (col == LOCKCOL) {
return t.canLock(Turnout.CABLOCKOUT + Turnout.PUSHBUTTONLOCKOUT);
} else if (col == KNOWNCOL) {
return false;
} else if (col == MODECOL) {
return true;
} else if (col == SENSOR1COL) {
return true;
} else if (col == SENSOR2COL) {
return true;
} else if (col == OPSONOFFCOL) {
return true;
} else if (col == OPSEDITCOL) {
return t.getTurnoutOperation() != null;
} else if (col == LOCKOPRCOL) {
return true;
} else if (col == LOCKDECCOL) {
return true;
} else if (col == DIVERGCOL) {
return true;
} else if (col == STRAIGHTCOL) {
return true;
} else if (col == EDITCOL) {
return true;
} else {
return super.isCellEditable(row, col);
}
}
@Override
public Object getValueAt(int row, int col) {
// some error checking
if (row >= sysNameList.size()) {
log.debug("row is greater than name list");
return "error";
}
String name = sysNameList.get(row);
TurnoutManager manager = turnManager;
Turnout t = manager.getBySystemName(name);
if (t == null) {
log.debug("error null turnout!");
return "error";
}
if (col == INVERTCOL) {
boolean val = t.getInverted();
return Boolean.valueOf(val);
} else if (col == LOCKCOL) {
boolean val = t.getLocked(Turnout.CABLOCKOUT + Turnout.PUSHBUTTONLOCKOUT);
return Boolean.valueOf(val);
} else if (col == KNOWNCOL) {
if (t.getKnownState() == Turnout.CLOSED) {
return closedText;
}
if (t.getKnownState() == Turnout.THROWN) {
return thrownText;
}
if (t.getKnownState() == Turnout.INCONSISTENT) {
return Bundle.getMessage("BeanStateInconsistent");
} else {
// "Unknown"
return Bundle.getMessage("BeanStateUnknown");
}
} else if (col == MODECOL) {
JComboBox<String> c = new JComboBox<String>(t.getValidFeedbackNames());
c.setSelectedItem(t.getFeedbackModeName());
c.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
comboBoxAction(e);
}
});
return c;
} else if (col == SENSOR1COL) {
return t.getFirstSensor();
} else if (col == SENSOR2COL) {
return t.getSecondSensor();
} else if (col == OPSONOFFCOL) {
return makeAutomationBox(t);
} else if (col == OPSEDITCOL) {
return Bundle.getMessage("EditTurnoutOperation");
} else if (col == EDITCOL) {
return Bundle.getMessage("ButtonEdit");
} else if (col == LOCKDECCOL) {
JComboBox<String> c = new JComboBox<String>(t.getValidDecoderNames());
c.setSelectedItem(t.getDecoderName());
c.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
comboBoxAction(e);
}
});
return c;
} else if (col == LOCKOPRCOL) {
JComboBox<String> c = new JComboBox<String>(lockOperations);
if (t.canLock(Turnout.CABLOCKOUT) && t.canLock(Turnout.PUSHBUTTONLOCKOUT)) {
c.setSelectedItem(bothText);
} else if (t.canLock(Turnout.PUSHBUTTONLOCKOUT)) {
c.setSelectedItem(pushbutText);
} else if (t.canLock(Turnout.CABLOCKOUT)) {
c.setSelectedItem(cabOnlyText);
} else {
c.setSelectedItem(noneText);
}
c.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
comboBoxAction(e);
}
});
return c;
} else if (col == STRAIGHTCOL) {
String speed = t.getStraightSpeed();
if (!speedListClosed.contains(speed)) {
speedListClosed.add(speed);
}
JComboBox<String> c = new JComboBox<String>(speedListClosed);
c.setEditable(true);
c.setSelectedItem(speed);
return c;
} else if (col == DIVERGCOL) {
String speed = t.getDivergingSpeed();
if (!speedListThrown.contains(speed)) {
speedListThrown.add(speed);
}
JComboBox<String> c = new JComboBox<String>(speedListThrown);
c.setEditable(true);
c.setSelectedItem(speed);
return c;
// } else if (col == VALUECOL && _graphicState) { // not neeeded as the
// graphic ImageIconRenderer uses the same super.getValueAt(row, col) as classic bean state text button
}
return super.getValueAt(row, col);
}
@Override
public void setValueAt(Object value, int row, int col) {
String name = sysNameList.get(row);
TurnoutManager manager = turnManager;
Turnout t = manager.getBySystemName(name);
if (col == INVERTCOL) {
if (t.canInvert()) {
boolean b = ((Boolean) value).booleanValue();
t.setInverted(b);
}
} else if (col == LOCKCOL) {
boolean b = ((Boolean) value).booleanValue();
t.setLocked(Turnout.CABLOCKOUT + Turnout.PUSHBUTTONLOCKOUT, b);
} else if (col == MODECOL) {
@SuppressWarnings("unchecked") String modeName = (String) ((JComboBox<String>) value).getSelectedItem();
t.setFeedbackMode(modeName);
} else if (col == SENSOR1COL) {
try {
t.provideFirstFeedbackSensor((String) value);
} catch (jmri.JmriException e) {
JOptionPane.showMessageDialog(null, e.toString());
}
fireTableRowsUpdated(row, row);
} else if (col == SENSOR2COL) {
try {
t.provideSecondFeedbackSensor((String) value);
} catch (jmri.JmriException e) {
JOptionPane.showMessageDialog(null, e.toString());
}
fireTableRowsUpdated(row, row);
} else if (col == OPSONOFFCOL) {
// do nothing as this is handled by the combo box listener
} else if (col == OPSEDITCOL) {
t.setInhibitOperation(false);
// cast to JComboBox<String> required in OPSEDITCOL
@SuppressWarnings("unchecked") JComboBox<String> cb = (JComboBox<String>) getValueAt(row, OPSONOFFCOL);
log.debug("opsSelected = {}", getValueAt(row, OPSONOFFCOL).toString());
editTurnoutOperation(t, cb);
} else if (col == EDITCOL) {
class WindowMaker implements Runnable {
Turnout t;
WindowMaker(Turnout t) {
this.t = t;
}
@Override
public void run() {
editButton(t);
}
}
WindowMaker w = new WindowMaker(t);
javax.swing.SwingUtilities.invokeLater(w);
} else if (col == LOCKOPRCOL) {
@SuppressWarnings("unchecked") String lockOpName = (String) ((JComboBox<String>) value).getSelectedItem();
if (lockOpName.equals(bothText)) {
t.enableLockOperation(Turnout.CABLOCKOUT + Turnout.PUSHBUTTONLOCKOUT, true);
}
if (lockOpName.equals(cabOnlyText)) {
t.enableLockOperation(Turnout.CABLOCKOUT, true);
t.enableLockOperation(Turnout.PUSHBUTTONLOCKOUT, false);
}
if (lockOpName.equals(pushbutText)) {
t.enableLockOperation(Turnout.CABLOCKOUT, false);
t.enableLockOperation(Turnout.PUSHBUTTONLOCKOUT, true);
}
} else if (col == LOCKDECCOL) {
@SuppressWarnings("unchecked") String decoderName = (String) ((JComboBox<String>) value).getSelectedItem();
t.setDecoderName(decoderName);
} else if (col == STRAIGHTCOL) {
@SuppressWarnings("unchecked") String speed = (String) ((JComboBox<String>) value).getSelectedItem();
try {
t.setStraightSpeed(speed);
} catch (jmri.JmriException ex) {
JOptionPane.showMessageDialog(null, ex.getMessage() + "\n" + speed);
return;
}
if ((!speedListClosed.contains(speed)) && !speed.contains("Global")) {
speedListClosed.add(speed);
}
fireTableRowsUpdated(row, row);
} else if (col == DIVERGCOL) {
@SuppressWarnings("unchecked") String speed = (String) ((JComboBox<String>) value).getSelectedItem();
try {
t.setDivergingSpeed(speed);
} catch (jmri.JmriException ex) {
JOptionPane.showMessageDialog(null, ex.getMessage() + "\n" + speed);
return;
}
if ((!speedListThrown.contains(speed)) && !speed.contains("Global")) {
speedListThrown.add(speed);
}
fireTableRowsUpdated(row, row);
} else if (col == VALUECOL && _graphicState) {
// respond to clicking on ImageIconRenderer CellEditor
clickOn(t);
fireTableRowsUpdated(row, row);
} else {
super.setValueAt(value, row, col);
}
}
@Override
public String getValue(String name) {
int val = turnManager.getBySystemName(name).getCommandedState();
switch(val) {
case Turnout.CLOSED:
return closedText;
case Turnout.THROWN:
return thrownText;
case Turnout.UNKNOWN:
return Bundle.getMessage("BeanStateUnknown");
case Turnout.INCONSISTENT:
return Bundle.getMessage("BeanStateInconsistent");
default:
return "Unexpected value: " + val;
}
}
@Override
public Manager getManager() {
return turnManager;
}
@Override
public NamedBean getBySystemName(String name) {
return turnManager.getBySystemName(name);
}
@Override
public NamedBean getByUserName(String name) {
return turnManager.getByUserName(name);
}
@Override
protected String getMasterClassName() {
return getClassName();
}
@Override
public void clickOn(NamedBean t) {
int state = ((Turnout) t).getCommandedState();
if (state == Turnout.CLOSED) {
((Turnout) t).setCommandedState(Turnout.THROWN);
} else {
((Turnout) t).setCommandedState(Turnout.CLOSED);
}
}
@Override
public void configureTable(JTable tbl) {
table = tbl;
table.setDefaultRenderer(Boolean.class, new EnablingCheckboxRenderer());
table.setDefaultRenderer(JComboBox.class, new jmri.jmrit.symbolicprog.ValueRenderer());
table.setDefaultEditor(JComboBox.class, new jmri.jmrit.symbolicprog.ValueEditor());
setColumnToHoldButton(table, OPSEDITCOL, editButton());
setColumnToHoldButton(table, EDITCOL, editButton());
//Hide the following columns by default
XTableColumnModel columnModel = (XTableColumnModel) table.getColumnModel();
TableColumn column = columnModel.getColumnByModelIndex(STRAIGHTCOL);
columnModel.setColumnVisible(column, false);
column = columnModel.getColumnByModelIndex(DIVERGCOL);
columnModel.setColumnVisible(column, false);
column = columnModel.getColumnByModelIndex(KNOWNCOL);
columnModel.setColumnVisible(column, false);
column = columnModel.getColumnByModelIndex(MODECOL);
columnModel.setColumnVisible(column, false);
column = columnModel.getColumnByModelIndex(SENSOR1COL);
columnModel.setColumnVisible(column, false);
column = columnModel.getColumnByModelIndex(SENSOR2COL);
columnModel.setColumnVisible(column, false);
column = columnModel.getColumnByModelIndex(OPSONOFFCOL);
columnModel.setColumnVisible(column, false);
column = columnModel.getColumnByModelIndex(OPSEDITCOL);
columnModel.setColumnVisible(column, false);
column = columnModel.getColumnByModelIndex(LOCKOPRCOL);
columnModel.setColumnVisible(column, false);
column = columnModel.getColumnByModelIndex(LOCKDECCOL);
columnModel.setColumnVisible(column, false);
super.configureTable(table);
}
// update table if turnout lock or feedback changes
@Override
protected boolean matchPropertyName(java.beans.PropertyChangeEvent e) {
if (e.getPropertyName().equals("locked")) {
return true;
}
if (e.getPropertyName().equals("feedbackchange")) {
return true;
}
if (e.getPropertyName().equals("TurnoutDivergingSpeedChange")) {
return true;
}
if (e.getPropertyName().equals("TurnoutStraightSpeedChange")) {
return true;
} else {
return super.matchPropertyName(e);
}
}
public void comboBoxAction(ActionEvent e) {
if (log.isDebugEnabled()) {
log.debug("Combobox change");
}
if (table != null && table.getCellEditor() != null) {
table.getCellEditor().stopCellEditing();
}
}
@Override
public void propertyChange(java.beans.PropertyChangeEvent e) {
if (e.getPropertyName().equals("DefaultTurnoutClosedSpeedChange")) {
updateClosedList();
} else if (e.getPropertyName().equals("DefaultTurnoutThrownSpeedChange")) {
updateThrownList();
} else {
super.propertyChange(e);
}
}
@Override
protected String getBeanType() {
return Bundle.getMessage("BeanNameTurnout");
}
/**
* Customize the turnout table Value (State) column to show an appropriate graphic for the turnout state
* if _graphicState = true, or (default) just show the localized state text
* when the TableDataModel is being called from ListedTableAction.
*
* @param table a JTable of Turnouts
*/
@Override
protected void configValueColumn(JTable table) {
// have the value column hold a JPanel (icon)
//setColumnToHoldButton(table, VALUECOL, new JLabel("12345678")); // for larger, wide round icon, but cannot be converted to JButton
// add extras, override BeanTableDataModel
log.debug("Turnout configValueColumn (I am {})", super.toString());
if (_graphicState) {
// load icons, only once
// editor
table.setDefaultEditor(JLabel.class, new ImageIconRenderer());
// item class copied from SwitchboardEditor panel
table.setDefaultRenderer(JLabel.class, new ImageIconRenderer());
} else {
// classic text style state indication
super.configValueColumn(table);
}
}
@Override
public JTable makeJTable(@Nonnull String name, @Nonnull TableModel model, @Nullable RowSorter<? extends TableModel> sorter) {
JTable table = this.makeJTable(model);
table.setName(name);
table.setRowSorter(sorter);
table.getTableHeader().setReorderingAllowed(true);
table.setColumnModel(new XTableColumnModel());
table.createDefaultColumnsFromModel();
addMouseListenerToHeader(table);
return table;
}
@Override
public JTable makeJTable(TableSorter sorter) {
JTable table = this.makeJTable((TableModel) sorter);
table.getTableHeader().setReorderingAllowed(true);
table.setColumnModel(new XTableColumnModel());
table.createDefaultColumnsFromModel();
addMouseListenerToHeader(table);
return table;
}
private JTable makeJTable(TableModel model) {
return new JTable(model) {
@Override
public TableCellRenderer getCellRenderer(int row, int column) {
// Convert the displayed index to the model index, rather than the displayed index
int modelColumn = this.convertColumnIndexToModel(column);
if (modelColumn == SENSOR1COL || modelColumn == SENSOR2COL) {
return getRenderer(row, modelColumn);
} else {
return super.getCellRenderer(row, column);
}
}
@Override
public TableCellEditor getCellEditor(int row, int column) {
//Convert the displayed index to the model index, rather than the displayed index
int modelColumn = this.convertColumnIndexToModel(column);
if (modelColumn == SENSOR1COL || modelColumn == SENSOR2COL) {
return getEditor(row, modelColumn);
} else {
return super.getCellEditor(row, column);
}
}
TableCellRenderer getRenderer(int row, int column) {
TableCellRenderer retval = null;
if (column == SENSOR1COL) {
retval = rendererMapSensor1.get(getModel().getValueAt(row, SYSNAMECOL));
} else if (column == SENSOR2COL) {
retval = rendererMapSensor2.get(getModel().getValueAt(row, SYSNAMECOL));
} else {
return null;
}
if (retval == null) {
Turnout t = turnManager.getBySystemName((String) getModel().getValueAt(row, SYSNAMECOL));
if (t == null) {
return null;
}
retval = new BeanBoxRenderer();
if (column == SENSOR1COL) {
((JmriBeanComboBox) retval).setSelectedBean(t.getFirstSensor());
rendererMapSensor1.put(getModel().getValueAt(row, SYSNAMECOL), retval);
} else {
((JmriBeanComboBox) retval).setSelectedBean(t.getSecondSensor());
rendererMapSensor2.put(getModel().getValueAt(row, SYSNAMECOL), retval);
}
}
return retval;
}
Hashtable<Object, TableCellRenderer> rendererMapSensor1 = new Hashtable<>();
Hashtable<Object, TableCellRenderer> rendererMapSensor2 = new Hashtable<>();
TableCellEditor getEditor(int row, int column) {
TableCellEditor retval = null;
switch(column) {
case SENSOR1COL:
retval = editorMapSensor1.get(getModel().getValueAt(row, SYSNAMECOL));
break;
case SENSOR2COL:
retval = editorMapSensor2.get(getModel().getValueAt(row, SYSNAMECOL));
break;
default:
return null;
}
if (retval == null) {
Turnout t = turnManager.getBySystemName((String) getModel().getValueAt(row, SYSNAMECOL));
if (t == null) {
return null;
}
JmriBeanComboBox c;
if (column == SENSOR1COL) {
c = new JmriBeanComboBox(InstanceManager.sensorManagerInstance(), t.getFirstSensor(), JmriBeanComboBox.DisplayOptions.DISPLAYNAME);
retval = new BeanComboBoxEditor(c);
editorMapSensor1.put(getModel().getValueAt(row, SYSNAMECOL), retval);
} else {
//Must be two
c = new JmriBeanComboBox(InstanceManager.sensorManagerInstance(), t.getSecondSensor(), JmriBeanComboBox.DisplayOptions.DISPLAYNAME);
retval = new BeanComboBoxEditor(c);
editorMapSensor2.put(getModel().getValueAt(row, SYSNAMECOL), retval);
}
c.setFirstItemBlank(true);
}
return retval;
}
Hashtable<Object, TableCellEditor> editorMapSensor1 = new Hashtable<>();
Hashtable<Object, TableCellEditor> editorMapSensor2 = new Hashtable<>();
};
}
/**
* Visualize state in table as a graphic, customized for Turnouts (4 states).
* Renderer and Editor are identical, as the cell contents are not actually edited,
* only used to toggle state using {@link #clickOn(NamedBean)}.
* @see jmri.jmrit.beantable.sensor.SensorTableDataModel.ImageIconRenderer
* @see jmri.jmrit.beantable.BlockTableAction#createModel()
* @see jmri.jmrit.beantable.LightTableAction#createModel()
*/
class ImageIconRenderer extends AbstractCellEditor implements TableCellEditor, TableCellRenderer {
protected JLabel label;
// also used in display.switchboardEditor
protected String rootPath = "resources/icons/misc/switchboard/";
// for Turnout
protected char beanTypeChar = 'T';
protected String onIconPath = rootPath + beanTypeChar + "-on-s.png";
protected String offIconPath = rootPath + beanTypeChar + "-off-s.png";
protected BufferedImage onImage;
protected BufferedImage offImage;
protected ImageIcon onIcon;
protected ImageIcon offIcon;
protected int iconHeight = -1;
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
log.debug("Renderer Item = {}, State = {}", row, value);
if (iconHeight < 0) {
// load resources only first time, either for renderer or editor
loadIcons();
log.debug("icons loaded");
}
return updateLabel((String) value, row);
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
log.debug("Renderer Item = {}, State = {}", row, value);
if (iconHeight < 0) {
// load resources only first time, either for renderer or editor
loadIcons();
log.debug("icons loaded");
}
return updateLabel((String) value, row);
}
public JLabel updateLabel(String value, int row) {
if (iconHeight > 0) {
// if necessary, increase row height;
table.setRowHeight(row, Math.max(table.getRowHeight(), iconHeight - 5));
}
if (value.equals(closedText) && offIcon != null) {
label = new JLabel(offIcon);
label.setVerticalAlignment(JLabel.BOTTOM);
log.debug("offIcon set");
} else if (value.equals(thrownText) && onIcon != null) {
label = new JLabel(onIcon);
label.setVerticalAlignment(JLabel.BOTTOM);
log.debug("onIcon set");
} else if (value.equals(Bundle.getMessage("BeanStateInconsistent"))) {
// centered text alignment
label = new JLabel("X", JLabel.CENTER);
label.setForeground(Color.red);
log.debug("Turnout state inconsistent");
iconHeight = 0;
} else if (value.equals(Bundle.getMessage("BeanStateUnknown"))) {
// centered text alignment
label = new JLabel("?", JLabel.CENTER);
log.debug("Turnout state unknown");
iconHeight = 0;
} else {
// failed to load icon
// centered text alignment
label = new JLabel(value, JLabel.CENTER);
log.warn("Error reading icons for TurnoutTable");
iconHeight = 0;
}
label.setToolTipText(value);
label.addMouseListener(new MouseAdapter() {
@Override
public final void mousePressed(MouseEvent evt) {
log.debug("Clicked on icon in row {}", row);
stopCellEditing();
}
});
return label;
}
@Override
public Object getCellEditorValue() {
log.debug("getCellEditorValue, me = {})", this.toString());
return this.toString();
}
/**
* Read and buffer graphics. Only called once for this table.
* @see #getTableCellEditorComponent(JTable, Object, boolean, int, int)
*/
protected void loadIcons() {
try {
onImage = ImageIO.read(new File(onIconPath));
offImage = ImageIO.read(new File(offIconPath));
} catch (IOException ex) {
log.error("error reading image from {} or {}", onIconPath, offIconPath, ex);
}
log.debug("Success reading images");
int imageWidth = onImage.getWidth();
int imageHeight = onImage.getHeight();
// scale icons 50% to fit in table rows
Image smallOnImage = onImage.getScaledInstance(imageWidth / 2, imageHeight / 2, Image.SCALE_DEFAULT);
Image smallOffImage = offImage.getScaledInstance(imageWidth / 2, imageHeight / 2, Image.SCALE_DEFAULT);
onIcon = new ImageIcon(smallOnImage);
offIcon = new ImageIcon(smallOffImage);
iconHeight = onIcon.getIconHeight();
}
}
};
// end of custom data model
}
use of jmri.Turnout in project JMRI by JMRI.
the class IndicatorTurnoutIconXml method store.
/**
* Default implementation for storing the contents of a IndicatorTurnoutIcon
*
* @param o Object to store, of type IndicatorTurnoutIcon
* @return Element containing the complete info
*/
@Override
public Element store(Object o) {
IndicatorTurnoutIcon p = (IndicatorTurnoutIcon) o;
if (!p.isActive()) {
// if flagged as inactive, don't store
return null;
}
Element element = new Element("indicatorturnouticon");
storeCommonAttributes(p, element);
NamedBeanHandle<Turnout> t = p.getNamedTurnout();
if (t != null) {
element.addContent(storeNamedBean("turnout", t));
}
NamedBeanHandle<OBlock> b = p.getNamedOccBlock();
if (b != null) {
element.addContent(storeNamedBean("occupancyblock", b));
}
NamedBeanHandle<Sensor> s = p.getNamedOccSensor();
if (b == null && s != null) {
// only write sensor if no OBlock
element.addContent(storeNamedBean("occupancysensor", s));
}
Element elem = new Element("showTrainName");
String show = "no";
if (p.showTrain()) {
show = "yes";
}
elem.addContent(show);
element.addContent(elem);
HashMap<String, HashMap<Integer, NamedIcon>> iconMaps = p.getIconMaps();
Iterator<Entry<String, HashMap<Integer, NamedIcon>>> it = iconMaps.entrySet().iterator();
Element el = new Element("iconmaps");
String family = p.getFamily();
if (family != null) {
el.setAttribute("family", family);
}
while (it.hasNext()) {
Entry<String, HashMap<Integer, NamedIcon>> ent = it.next();
elem = new Element(ent.getKey());
Iterator<Entry<Integer, NamedIcon>> iter = ent.getValue().entrySet().iterator();
while (iter.hasNext()) {
Entry<Integer, NamedIcon> entry = iter.next();
elem.addContent(storeIcon(p.getStateName(entry.getKey()), entry.getValue()));
}
el.addContent(elem);
}
element.addContent(el);
elem = new Element("paths");
ArrayList<String> paths = p.getPaths();
if (paths != null) {
for (int i = 0; i < paths.size(); i++) {
Element e = new Element("path");
e.addContent(paths.get(i));
elem.addContent(e);
}
element.addContent(elem);
}
element.setAttribute("class", "jmri.jmrit.display.configurexml.IndicatorTurnoutIconXml");
return element;
}
use of jmri.Turnout in project JMRI by JMRI.
the class TurnoutIcon method setTurnout.
/**
* Attach a named turnout to this display item.
*
* @param pName Used as a system/user name to lookup the turnout object
*/
public void setTurnout(String pName) {
if (InstanceManager.getNullableDefault(jmri.TurnoutManager.class) != null) {
try {
Turnout turnout = InstanceManager.turnoutManagerInstance().provideTurnout(pName);
setTurnout(jmri.InstanceManager.getDefault(jmri.NamedBeanHandleManager.class).getNamedBeanHandle(pName, turnout));
} catch (IllegalArgumentException ex) {
log.error("Turnout '" + pName + "' not available, icon won't see changes");
}
} else {
log.error("No TurnoutManager for this protocol, icon won't see changes");
}
}
Aggregations