001package jmri.jmrit.logixng.tools.swing;
002
003import java.awt.*;
004import java.util.*;
005import java.util.function.Predicate;
006
007import javax.swing.*;
008import javax.swing.table.TableColumnModel;
009
010import jmri.NamedBean;
011import jmri.jmrit.display.Positionable;
012import jmri.jmrit.logixng.InlineLogixNG;
013import jmri.jmrit.logixng.LogixNG;
014import jmri.util.JmriJFrame;
015
016/**
017 * Shows the inline LogixNGs.
018 *
019 * @author Daniel Bergqvist Copyright (C) 2022
020 */
021public class InlineLogixNGsFrame extends JmriJFrame {
022
023    private final JComboBox<String> _filterOnPanel = new JComboBox<>();
024    private final JComboBox<String> _filterOnIcon = new JComboBox<>();
025    private final InlineLogixNGsTableModel _inlineLogixNGsTableModel =
026            new InlineLogixNGsTableModel();
027
028    /**
029     * Construct a InlineLogixNGsFrame.
030     */
031    public InlineLogixNGsFrame() {
032        setTitle(Bundle.getMessage("TitleInlineLogixNGs"));
033    }
034
035    @Override
036    public void initComponents() {
037        super.initComponents();
038
039        Container contentPanel = getContentPane();
040//        contentPanel.setLayout(new GridLayout( 0, 1));
041        contentPanel.setLayout(new BoxLayout(contentPanel, BoxLayout.Y_AXIS));
042
043        JPanel panel = new JPanel();
044        JPanel filterPanel = new JPanel();
045        filterPanel.setBorder(BorderFactory.createTitledBorder(Bundle.getMessage("InlineLogixNGsFrame_Filter")));
046        filterPanel.setLayout(new java.awt.GridBagLayout());
047        java.awt.GridBagConstraints c = new java.awt.GridBagConstraints();
048        c.gridwidth = 1;
049        c.gridheight = 1;
050        c.gridx = 0;
051        c.gridy = 0;
052        c.anchor = java.awt.GridBagConstraints.EAST;
053        JLabel filterOnPanelLabel = new JLabel(Bundle.getMessage("InlineLogixNGsFrame_Filter_Panel"));
054        filterPanel.add(filterOnPanelLabel, c);
055        filterOnPanelLabel.setLabelFor(_filterOnPanel);
056        c.gridy = 2;
057        JLabel filterOnIconLabel = new JLabel(Bundle.getMessage("InlineLogixNGsFrame_Filter_IconType"));
058        filterPanel.add(filterOnIconLabel, c);
059        filterOnIconLabel.setLabelFor(_filterOnIcon);
060        c.gridx = 1;
061        filterPanel.add(Box.createHorizontalStrut(3), c);
062        c.gridx = 2;
063        c.gridy = 1;
064        filterPanel.add(Box.createVerticalStrut(3), c);
065        c.gridx = 2;
066        c.gridy = 0;
067        c.anchor = java.awt.GridBagConstraints.WEST;
068        c.weightx = 1.0;
069        c.fill = java.awt.GridBagConstraints.HORIZONTAL;  // text field will expand
070        filterPanel.add(_filterOnPanel, c);
071        c.gridy = 2;
072        filterPanel.add(_filterOnIcon, c);
073        panel.add(filterPanel);
074        contentPanel.add(panel);
075
076
077        JTable table = new JTable();
078        _inlineLogixNGsTableModel.init();
079        table.setModel(_inlineLogixNGsTableModel);
080        TableColumnModel columnModel = table.getColumnModel();
081//        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
082        JLabel positionColumn = new JLabel("8888888");
083        int positionColumnWidth = positionColumn.getPreferredSize().width;
084        columnModel.getColumn(InlineLogixNGsTableModel.COLUMN_POS_X)
085                .setMaxWidth(positionColumnWidth);
086        columnModel.getColumn(InlineLogixNGsTableModel.COLUMN_POS_Y)
087                .setMaxWidth(positionColumnWidth);
088        table.setDefaultRenderer(InlineLogixNGsTableModel.Menu.class,
089                new InlineLogixNGsTableModel.MenuCellRenderer());
090        table.setDefaultEditor(InlineLogixNGsTableModel.Menu.class,
091                new InlineLogixNGsTableModel.MenuCellEditor(table, _inlineLogixNGsTableModel));
092        _inlineLogixNGsTableModel.setColumnForMenu(table);
093        table.setAutoCreateRowSorter(true);
094        JScrollPane scrollpane = new JScrollPane(table);
095        scrollpane.setPreferredSize(new Dimension(600, 400));
096        contentPanel.add(scrollpane);
097
098        Set<String> panels = new HashSet<>();
099        Set<String> icons = new HashSet<>();
100        for (LogixNG logixNG : _inlineLogixNGsTableModel.getLogixNGList()) {
101            String editorName = InlineLogixNGsTableModel.getEditorName(logixNG.getInlineLogixNG());
102            String typeName = InlineLogixNGsTableModel.getTypeName(logixNG.getInlineLogixNG());
103            if (editorName != null && !editorName.isBlank()) panels.add(editorName);
104            if (typeName != null && !typeName.isBlank()) icons.add(typeName);
105        }
106
107        _filterOnPanel.addItem("");
108        for (String s : panels) _filterOnPanel.addItem(s);
109        _filterOnPanel.addActionListener((evt)->{updateFilters();});
110
111        _filterOnIcon.addItem("");
112        for (String s : icons) _filterOnIcon.addItem(s);
113        _filterOnIcon.addActionListener((evt)->{updateFilters();});
114
115        pack();
116    }
117
118    private void updateFilters() {
119        String filterOnPanelValue = _filterOnPanel.getItemAt(_filterOnPanel.getSelectedIndex());
120        String filterOnIconValue = _filterOnIcon.getItemAt(_filterOnIcon.getSelectedIndex());
121
122        Predicate<LogixNG> filter = (LogixNG logixNG) -> {
123            String editorName = logixNG.getInlineLogixNG() != null
124                    ? logixNG.getInlineLogixNG().getEditorName() : "";
125            String typeName = logixNG.getInlineLogixNG() != null
126                    ? logixNG.getInlineLogixNG().getTypeName() : "";
127            if (!filterOnPanelValue.equals("")) {
128                if (editorName == null || !filterOnPanelValue.equals(editorName)) {
129                    return false;
130                }
131            }
132            if (!filterOnIconValue.equals("")) {
133                if (typeName == null || !filterOnIconValue.equals(typeName)) {
134                    return false;
135                }
136            }
137            return true;
138        };
139
140        _inlineLogixNGsTableModel.setFilter(filter);
141    }
142
143}