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}