Search in sources :

Example 6 with XTableColumnModel

use of jmri.util.swing.XTableColumnModel in project JMRI by JMRI.

the class TableFrames method makeBlockFrame.

/*
     * ********************* BlockFrame *****************************
     */
protected JInternalFrame makeBlockFrame() {
    JInternalFrame frame = new JInternalFrame(Bundle.getMessage("TitleBlockTable"), true, false, false, true);
    _oBlockModel = new OBlockTableModel(this);
    _oBlockTable = new JTable(_oBlockModel);
    TableRowSorter<OBlockTableModel> sorter = new TableRowSorter<>(_oBlockModel);
    sorter.setComparator(OBlockTableModel.SYSNAMECOL, new jmri.util.SystemNameComparator());
    _oBlockTable.setRowSorter(sorter);
    _oBlockTable.setTransferHandler(new jmri.util.DnDTableImportExportHandler(new int[] { OBlockTableModel.EDIT_COL, OBlockTableModel.DELETE_COL, OBlockTableModel.REPORT_CURRENTCOL, OBlockTableModel.SPEEDCOL, OBlockTableModel.PERMISSIONCOL, OBlockTableModel.UNITSCOL }));
    _oBlockTable.setDragEnabled(true);
    // Use XTableColumnModel so we can control which columns are visible
    XTableColumnModel tcm = new XTableColumnModel();
    _oBlockTable.setColumnModel(tcm);
    _oBlockTable.getTableHeader().setReorderingAllowed(true);
    _oBlockTable.createDefaultColumnsFromModel();
    _oBlockModel.addHeaderListener(_oBlockTable);
    _oBlockTable.setDefaultEditor(JComboBox.class, new jmri.jmrit.symbolicprog.ValueEditor());
    _oBlockTable.getColumnModel().getColumn(OBlockTableModel.EDIT_COL).setCellEditor(new ButtonEditor(new JButton()));
    _oBlockTable.getColumnModel().getColumn(OBlockTableModel.EDIT_COL).setCellRenderer(new ButtonRenderer());
    _oBlockTable.getColumnModel().getColumn(OBlockTableModel.DELETE_COL).setCellEditor(new ButtonEditor(new JButton()));
    _oBlockTable.getColumnModel().getColumn(OBlockTableModel.DELETE_COL).setCellRenderer(new ButtonRenderer());
    _oBlockTable.getColumnModel().getColumn(OBlockTableModel.UNITSCOL).setCellRenderer(new MyBooleanRenderer(Bundle.getMessage("cm"), Bundle.getMessage("in")));
    JComboBox<String> box = new JComboBox<String>(OBlockTableModel.curveOptions);
    _oBlockTable.getColumnModel().getColumn(OBlockTableModel.CURVECOL).setCellEditor(new DefaultCellEditor(box));
    _oBlockTable.getColumnModel().getColumn(OBlockTableModel.REPORT_CURRENTCOL).setCellRenderer(new MyBooleanRenderer(Bundle.getMessage("Current"), Bundle.getMessage("Last")));
    box = new JComboBox<String>(jmri.InstanceManager.getDefault(SignalSpeedMap.class).getValidSpeedNames());
    box.addItem("");
    _oBlockTable.getColumnModel().getColumn(OBlockTableModel.SPEEDCOL).setCellEditor(new DefaultCellEditor(box));
    _oBlockTable.getColumnModel().getColumn(OBlockTableModel.PERMISSIONCOL).setCellRenderer(new MyBooleanRenderer(Bundle.getMessage("Permissive"), Bundle.getMessage("Absolute")));
    _oBlockTable.addMouseListener(new MouseAdapter() {

        @Override
        public void mousePressed(MouseEvent me) {
            showPopup(me);
        }

        @Override
        public void mouseReleased(MouseEvent me) {
            showPopup(me);
        }
    });
    for (int i = 0; i < _oBlockModel.getColumnCount(); i++) {
        int width = _oBlockModel.getPreferredWidth(i);
        _oBlockTable.getColumnModel().getColumn(i).setPreferredWidth(width);
    }
    _oBlockTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    ROW_HEIGHT = _oBlockTable.getRowHeight();
    int tableWidth = _desktop.getPreferredSize().width;
    _oBlockTable.setPreferredScrollableViewportSize(new java.awt.Dimension(tableWidth, ROW_HEIGHT * 10));
    _blockTablePane = new JScrollPane(_oBlockTable);
    tcm.setColumnVisible(tcm.getColumnByModelIndex(OBlockTableModel.REPORTERCOL), false);
    tcm.setColumnVisible(tcm.getColumnByModelIndex(OBlockTableModel.REPORT_CURRENTCOL), false);
    tcm.setColumnVisible(tcm.getColumnByModelIndex(OBlockTableModel.PERMISSIONCOL), false);
    //        tcm.setColumnVisible(tcm.getColumnByModelIndex(OBlockTableModel.SPEEDCOL), false);
    //        tcm.setColumnVisible(tcm.getColumnByModelIndex(OBlockTableModel.ERR_SENSORCOL), false);
    tcm.setColumnVisible(tcm.getColumnByModelIndex(OBlockTableModel.CURVECOL), false);
    JPanel contentPane = new JPanel();
    contentPane.setLayout(new BorderLayout(5, 5));
    JLabel prompt = new JLabel(Bundle.getMessage("AddBlockPrompt"));
    contentPane.add(prompt, BorderLayout.NORTH);
    contentPane.add(_blockTablePane, BorderLayout.CENTER);
    frame.setContentPane(contentPane);
    frame.pack();
    return frame;
}
Also used : JPanel(javax.swing.JPanel) ButtonEditor(jmri.util.table.ButtonEditor) JButton(javax.swing.JButton) SignalSpeedMap(jmri.implementation.SignalSpeedMap) BorderLayout(java.awt.BorderLayout) TableRowSorter(javax.swing.table.TableRowSorter) JScrollPane(javax.swing.JScrollPane) MouseEvent(java.awt.event.MouseEvent) JComboBox(javax.swing.JComboBox) MouseAdapter(java.awt.event.MouseAdapter) JLabel(javax.swing.JLabel) XTableColumnModel(jmri.util.swing.XTableColumnModel) Point(java.awt.Point) DefaultCellEditor(javax.swing.DefaultCellEditor) Dimension(java.awt.Dimension) JTable(javax.swing.JTable) JInternalFrame(javax.swing.JInternalFrame) ButtonRenderer(jmri.util.table.ButtonRenderer)

Example 7 with XTableColumnModel

use of jmri.util.swing.XTableColumnModel 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
}
Also used : ActionEvent(java.awt.event.ActionEvent) TurnoutOperationManager(jmri.TurnoutOperationManager) InstanceManager(jmri.InstanceManager) TurnoutManager(jmri.TurnoutManager) GuiLafPreferencesManager(apps.gui.GuiLafPreferencesManager) Manager(jmri.Manager) Image(java.awt.Image) BufferedImage(java.awt.image.BufferedImage) JmriBeanComboBox(jmri.util.swing.JmriBeanComboBox) TableCellEditor(javax.swing.table.TableCellEditor) TableCellRenderer(javax.swing.table.TableCellRenderer) TableColumn(javax.swing.table.TableColumn) ActionListener(java.awt.event.ActionListener) JTable(javax.swing.JTable) Turnout(jmri.Turnout) File(java.io.File) TableModel(javax.swing.table.TableModel) TableSorter(jmri.util.com.sun.TableSorter) ImageIcon(javax.swing.ImageIcon) NamedBean(jmri.NamedBean) JButton(javax.swing.JButton) JTextField(javax.swing.JTextField) BufferedImage(java.awt.image.BufferedImage) AbstractCellEditor(javax.swing.AbstractCellEditor) MouseEvent(java.awt.event.MouseEvent) JComboBox(javax.swing.JComboBox) Hashtable(java.util.Hashtable) MouseAdapter(java.awt.event.MouseAdapter) JLabel(javax.swing.JLabel) IOException(java.io.IOException) XTableColumnModel(jmri.util.swing.XTableColumnModel) TurnoutManager(jmri.TurnoutManager)

Example 8 with XTableColumnModel

use of jmri.util.swing.XTableColumnModel in project JMRI by JMRI.

the class TurnoutTableAction method showFeedbackChanged.

void showFeedbackChanged() {
    boolean showFeedback = showFeedbackBox.isSelected();
    XTableColumnModel columnModel = (XTableColumnModel) table.getColumnModel();
    TableColumn column = columnModel.getColumnByModelIndex(KNOWNCOL);
    columnModel.setColumnVisible(column, showFeedback);
    column = columnModel.getColumnByModelIndex(MODECOL);
    columnModel.setColumnVisible(column, showFeedback);
    column = columnModel.getColumnByModelIndex(SENSOR1COL);
    columnModel.setColumnVisible(column, showFeedback);
    column = columnModel.getColumnByModelIndex(SENSOR2COL);
    columnModel.setColumnVisible(column, showFeedback);
    column = columnModel.getColumnByModelIndex(OPSONOFFCOL);
    columnModel.setColumnVisible(column, showFeedback);
    column = columnModel.getColumnByModelIndex(OPSEDITCOL);
    columnModel.setColumnVisible(column, showFeedback);
}
Also used : XTableColumnModel(jmri.util.swing.XTableColumnModel) TableColumn(javax.swing.table.TableColumn)

Example 9 with XTableColumnModel

use of jmri.util.swing.XTableColumnModel in project JMRI by JMRI.

the class CarsTableModel method toggleSelectVisible.

@SuppressFBWarnings(value = "ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD", // NOI18N
justification = "GUI ease of use")
public void toggleSelectVisible() {
    XTableColumnModel tcm = (XTableColumnModel) _table.getColumnModel();
    isSelectVisible = !tcm.isColumnVisible(tcm.getColumnByModelIndex(SELECT_COLUMN));
    tcm.setColumnVisible(tcm.getColumnByModelIndex(SELECT_COLUMN), isSelectVisible);
}
Also used : XTableColumnModel(jmri.util.swing.XTableColumnModel) SuppressFBWarnings(edu.umd.cs.findbugs.annotations.SuppressFBWarnings)

Example 10 with XTableColumnModel

use of jmri.util.swing.XTableColumnModel in project JMRI by JMRI.

the class CarsTableModel method setSort.

/**
     * Not all columns in the Cars table are shown. This was done to limit the
     * width of the table. Only one column from the following groups is shown at
     * any one time.
     * <p>
     * Load, Color, and RWE Load are grouped together.
     * <p>
     * Destination, Final Destination, and RWE Destination are grouped together.
     * <p>
     * Moves, Built, Owner, Value, RFID, Wait, Pickup, and Last are grouped
     * together.
     * @param sort The integer sort to use.
     *
     */
public void setSort(int sort) {
    _sort = sort;
    updateList();
    XTableColumnModel tcm = (XTableColumnModel) _table.getColumnModel();
    if (sort == SORTBY_COLOR || sort == SORTBY_LOAD || sort == SORTBY_RWE) {
        tcm.setColumnVisible(tcm.getColumnByModelIndex(LOAD_COLUMN), sort == SORTBY_LOAD);
        tcm.setColumnVisible(tcm.getColumnByModelIndex(COLOR_COLUMN), sort == SORTBY_COLOR);
        tcm.setColumnVisible(tcm.getColumnByModelIndex(RWE_LOAD_COLUMN), sort == SORTBY_RWE);
    }
    if (sort == SORTBY_DESTINATION || sort == SORTBY_FINALDESTINATION || sort == SORTBY_RWE) {
        tcm.setColumnVisible(tcm.getColumnByModelIndex(DESTINATION_COLUMN), sort == SORTBY_DESTINATION);
        tcm.setColumnVisible(tcm.getColumnByModelIndex(FINAL_DESTINATION_COLUMN), sort == SORTBY_FINALDESTINATION);
        tcm.setColumnVisible(tcm.getColumnByModelIndex(RWE_COLUMN), sort == SORTBY_RWE);
        tcm.setColumnVisible(tcm.getColumnByModelIndex(RWE_LOAD_COLUMN), sort == SORTBY_RWE);
        // show load column if color column isn't visible.
        tcm.setColumnVisible(tcm.getColumnByModelIndex(LOAD_COLUMN), sort != SORTBY_RWE && !tcm.isColumnVisible(tcm.getColumnByModelIndex(COLOR_COLUMN)));
    } else if (sort == SORTBY_MOVES || sort == SORTBY_BUILT || sort == SORTBY_OWNER || sort == SORTBY_VALUE || sort == SORTBY_RFID || sort == SORTBY_WAIT || sort == SORTBY_PICKUP || sort == SORTBY_LAST) {
        tcm.setColumnVisible(tcm.getColumnByModelIndex(MOVES_COLUMN), sort == SORTBY_MOVES);
        tcm.setColumnVisible(tcm.getColumnByModelIndex(BUILT_COLUMN), sort == SORTBY_BUILT);
        tcm.setColumnVisible(tcm.getColumnByModelIndex(OWNER_COLUMN), sort == SORTBY_OWNER);
        tcm.setColumnVisible(tcm.getColumnByModelIndex(VALUE_COLUMN), sort == SORTBY_VALUE);
        tcm.setColumnVisible(tcm.getColumnByModelIndex(RFID_COLUMN), sort == SORTBY_RFID);
        tcm.setColumnVisible(tcm.getColumnByModelIndex(RFID_WHEN_LAST_SEEN_COLUMN), sort == SORTBY_RFID);
        tcm.setColumnVisible(tcm.getColumnByModelIndex(RFID_WHERE_LAST_SEEN_COLUMN), sort == SORTBY_RFID);
        tcm.setColumnVisible(tcm.getColumnByModelIndex(WAIT_COLUMN), sort == SORTBY_WAIT);
        tcm.setColumnVisible(tcm.getColumnByModelIndex(PICKUP_COLUMN), sort == SORTBY_PICKUP);
        tcm.setColumnVisible(tcm.getColumnByModelIndex(LAST_COLUMN), sort == SORTBY_LAST);
    } else {
        fireTableDataChanged();
    }
}
Also used : XTableColumnModel(jmri.util.swing.XTableColumnModel)

Aggregations

XTableColumnModel (jmri.util.swing.XTableColumnModel)28 TableColumn (javax.swing.table.TableColumn)12 JButton (javax.swing.JButton)9 JTable (javax.swing.JTable)8 ButtonEditor (jmri.util.table.ButtonEditor)7 ButtonRenderer (jmri.util.table.ButtonRenderer)7 TableCellEditor (javax.swing.table.TableCellEditor)6 JLabel (javax.swing.JLabel)5 ActionEvent (java.awt.event.ActionEvent)3 ActionListener (java.awt.event.ActionListener)3 MouseEvent (java.awt.event.MouseEvent)3 JComboBox (javax.swing.JComboBox)3 JPanel (javax.swing.JPanel)3 RowSorter (javax.swing.RowSorter)3 TableColumnModel (javax.swing.table.TableColumnModel)3 TableRowSorter (javax.swing.table.TableRowSorter)3 MouseAdapter (java.awt.event.MouseAdapter)2 Hashtable (java.util.Hashtable)2 BoxLayout (javax.swing.BoxLayout)2 DefaultCellEditor (javax.swing.DefaultCellEditor)2