use of javax.swing.table.TableModel 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 javax.swing.table.TableModel in project jdk8u_jdk by JetBrains.
the class TableSorter method compareRowsByColumn.
public int compareRowsByColumn(int row1, int row2, int column) {
Class type = model.getColumnClass(column);
TableModel data = model;
// Check for nulls
Object o1 = data.getValueAt(row1, column);
Object o2 = data.getValueAt(row2, column);
// If both values are null return 0
if (o1 == null && o2 == null) {
return 0;
} else if (o1 == null) {
// Define null less than everything.
return -1;
} else if (o2 == null) {
return 1;
}
/* We copy all returned values from the getValue call in case
an optimised model is reusing one object to return many values.
The Number subclasses in the JDK are immutable and so will not be used
in this way but other subclasses of Number might want to do this to save
space and avoid unnecessary heap allocation.
*/
if (type.getSuperclass() == java.lang.Number.class) {
Number n1 = (Number) data.getValueAt(row1, column);
double d1 = n1.doubleValue();
Number n2 = (Number) data.getValueAt(row2, column);
double d2 = n2.doubleValue();
if (d1 < d2) {
return -1;
} else if (d1 > d2) {
return 1;
} else {
return 0;
}
} else if (type == java.util.Date.class) {
Date d1 = (Date) data.getValueAt(row1, column);
long n1 = d1.getTime();
Date d2 = (Date) data.getValueAt(row2, column);
long n2 = d2.getTime();
if (n1 < n2) {
return -1;
} else if (n1 > n2) {
return 1;
} else {
return 0;
}
} else if (type == String.class) {
String s1 = (String) data.getValueAt(row1, column);
String s2 = (String) data.getValueAt(row2, column);
int result = s1.compareTo(s2);
if (result < 0) {
return -1;
} else if (result > 0) {
return 1;
} else {
return 0;
}
} else if (type == Boolean.class) {
Boolean bool1 = (Boolean) data.getValueAt(row1, column);
boolean b1 = bool1.booleanValue();
Boolean bool2 = (Boolean) data.getValueAt(row2, column);
boolean b2 = bool2.booleanValue();
if (b1 == b2) {
return 0;
} else if (// Define false < true
b1) {
return 1;
} else {
return -1;
}
} else {
Object v1 = data.getValueAt(row1, column);
String s1 = v1.toString();
Object v2 = data.getValueAt(row2, column);
String s2 = v2.toString();
int result = s1.compareTo(s2);
if (result < 0) {
return -1;
} else if (result > 0) {
return 1;
} else {
return 0;
}
}
}
use of javax.swing.table.TableModel in project sling by apache.
the class RequestListSelectionListener method valueChanged.
public void valueChanged(ListSelectionEvent e) {
if (!e.getValueIsAdjusting()) {
ListSelectionModel lsm = (ListSelectionModel) e.getSource();
int idx = lsm.getMinSelectionIndex();
if (idx >= 0) {
try {
idx = table.getRowSorter().convertRowIndexToModel(idx);
TableModel tm = ((RequestTrackerFile) table.getModel()).getData(idx);
if (dataField == null) {
dataField = new JTable();
dataField.setAutoCreateRowSorter(true);
dataField.setGridColor(Color.GRAY);
dataField.setShowGrid(true);
dataField.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
dataField.setRowSelectionAllowed(true);
dataField.setTableHeader(new JTableHeader(dataField.getColumnModel()));
dataField.setFont(new Font("Monospaced", dataField.getFont().getStyle(), dataField.getFont().getSize()));
dataField.setShowHorizontalLines(false);
// dataField.setIntercellSpacing(new Dimension(3, 5));
JDialog d = new JDialog(this.parent);
d.add(new JScrollPane(dataField));
d.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
dataField = null;
}
});
// setup location and size and ensure updating preferences
Util.setupComponentLocationSize(d, REQUEST_X, REQUEST_Y, REQUEST_WIDTH, REQUEST_HEIGHT, (int) screenSize.getWidth() / 4, (int) screenSize.getHeight() / 4, (int) screenSize.getWidth() / 2, (int) screenSize.getHeight() / 2);
d.setVisible(true);
}
dataField.setModel(tm);
Util.setupColumnWidths(dataField.getColumnModel(), REQUEST_COLS);
} catch (IOException e1) {
// ignore
}
}
}
}
use of javax.swing.table.TableModel in project processdash by dtuma.
the class EVReport method customizeTaskTableWriter.
private static TableModel customizeTaskTableWriter(HTMLTableWriter writer, EVTaskList taskList, EVTaskFilter filter, EVReportSettings settings, boolean showTimingIcons) {
TableModel table = taskList.getSimpleTableModel(filter);
boolean hidePlan = settings.getBool(CUSTOMIZE_HIDE_PLAN_LINE);
boolean hideReplan = settings.getBool(CUSTOMIZE_HIDE_REPLAN_LINE);
boolean hideForecast = settings.getBool(CUSTOMIZE_HIDE_FORECAST_LINE);
boolean hideNames = settings.getBool(CUSTOMIZE_HIDE_NAMES);
customizeTableWriter(writer, table, EVTaskList.toolTips);
writer.setTableName("TASK");
writer.setSkipColumn(EVTaskList.PLAN_CUM_TIME_COLUMN, true);
writer.setSkipColumn(EVTaskList.PLAN_CUM_VALUE_COLUMN, true);
writer.setSkipColumn(EVTaskList.NOTES_COLUMN, true);
setupTaskTableRenderers(writer, showTimingIcons, settings.exportingToExcel(), hideNames, taskList.getNodeTypeSpecs());
if (!(taskList instanceof EVTaskListRollup) || hideNames)
writer.setSkipColumn(EVTaskList.ASSIGNED_TO_COLUMN, true);
if (hidePlan)
writer.setSkipColumn(EVTaskList.PLAN_DATE_COLUMN, true);
if (hideReplan)
writer.setSkipColumn(EVTaskList.REPLAN_DATE_COLUMN, true);
if (hideForecast)
writer.setSkipColumn(EVTaskList.FORECAST_DATE_COLUMN, true);
return table;
}
use of javax.swing.table.TableModel in project qi4j-sdk by Qi4j.
the class PropertiesPanel method reload.
/**
* Reload the table data with query based on the supplied query
*
* @param query the query to generate table data
*/
public void reload(Query query) {
TableModel tableModel = createData(query);
propertiesTable.setModel(tableModel);
}
Aggregations