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