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}