// License: GPL. For details, see LICENSE file. package panels; import java.awt.BorderLayout; import java.awt.Component; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.EnumMap; import javax.swing.DefaultCellEditor; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.SwingConstants; import javax.swing.table.AbstractTableModel; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; import javax.swing.table.TableModel; import messages.Messages; import seamarks.SeaMark; import seamarks.SeaMark.Att; import seamarks.SeaMark.Col; import seamarks.SeaMark.Exh; import seamarks.SeaMark.Lit; import seamarks.SeaMark.Vis; import smed.SmedAction; public class PanelSectors extends JFrame { private SmedAction dlg; private JPanel panel; private TableModel model; private JTable table; public JButton minusButton; private ActionListener alMinusButton = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if ((getSectorCount() > 1) && (table.getSelectedRow() != 0)) { deleteSector(table.getSelectedRow()); } } }; public JButton plusButton; private ActionListener alPlusButton = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (table.getSelectedRow() < 0) { addSector(table.getRowCount()); } else { addSector(table.getSelectedRow()+1); } } }; public JComboBox<ImageIcon> colourBox; public EnumMap<Col, ImageIcon> colours = new EnumMap<>(Col.class); public JComboBox<String> visibilityBox; public EnumMap<Vis, String> visibilities = new EnumMap<>(Vis.class); public JComboBox<String> exhibitionBox; public EnumMap<Exh, String> exhibitions = new EnumMap<>(Exh.class); public PanelSectors(SmedAction dia) { super(Messages.getString("SectorTable")); dlg = dia; setLayout(null); setSize(900, 100); setAlwaysOnTop(true); setLocation(450, 0); setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); minusButton = new JButton(new ImageIcon(getClass().getResource("/images/MinusButton.png"))); minusButton.setBounds(0, 0, 32, 34); minusButton.addActionListener(alMinusButton); add(minusButton); plusButton = new JButton(new ImageIcon(getClass().getResource("/images/PlusButton.png"))); plusButton.setBounds(0, 34, 32, 34); plusButton.addActionListener(alPlusButton); add(plusButton); panel = new JPanel(new BorderLayout()); panel.setBounds(40, 0, 860, 512); model = new SectorTable(); table = new JTable(model); table.setBounds(0, 0, 860, 34); table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); panel.add(new JScrollPane(table)); getContentPane().add(panel); table.setSize(860, ((table.getRowCount() * 16) + 28)); table.setDefaultRenderer(String.class, new CentreRenderer()); table.getColumnModel().getColumn(1).setCellRenderer(new ColourCellRenderer()); TableColumn colColumn = table.getColumnModel().getColumn(1); colourBox = new JComboBox<>(); addColItem(new ImageIcon(getClass().getResource("/images/DelButton.png")), Col.UNKCOL); addColItem(new ImageIcon(getClass().getResource("/images/WhiteButton.png")), Col.WHITE); addColItem(new ImageIcon(getClass().getResource("/images/RedButton.png")), Col.RED); addColItem(new ImageIcon(getClass().getResource("/images/GreenButton.png")), Col.GREEN); addColItem(new ImageIcon(getClass().getResource("/images/YellowButton.png")), Col.YELLOW); addColItem(new ImageIcon(getClass().getResource("/images/OrangeButton.png")), Col.ORANGE); addColItem(new ImageIcon(getClass().getResource("/images/AmberButton.png")), Col.AMBER); addColItem(new ImageIcon(getClass().getResource("/images/BlueButton.png")), Col.BLUE); addColItem(new ImageIcon(getClass().getResource("/images/VioletButton.png")), Col.VIOLET); colColumn.setCellEditor(new DefaultCellEditor(colourBox)); TableColumn visColumn = table.getColumnModel().getColumn(12); visibilityBox = new JComboBox<>(); addVisibItem("", Vis.UNKVIS); addVisibItem(Messages.getString("Intensified"), Vis.INTEN); addVisibItem(Messages.getString("Unintensified"), Vis.UNINTEN); addVisibItem(Messages.getString("PartiallyObscured"), Vis.PARTOBS); visColumn.setCellEditor(new DefaultCellEditor(visibilityBox)); TableColumn exhColumn = table.getColumnModel().getColumn(13); exhibitionBox = new JComboBox<>(); addExhibItem("", Exh.UNKEXH); addExhibItem(Messages.getString("24h"), Exh.H24); addExhibItem(Messages.getString("Day"), Exh.DAY); addExhibItem(Messages.getString("Night"), Exh.NIGHT); addExhibItem(Messages.getString("Fog"), Exh.FOG); exhColumn.setCellEditor(new DefaultCellEditor(exhibitionBox)); } private class SectorTable extends AbstractTableModel { private String[] headings = {Messages.getString("Sector"), Messages.getString("Colour"), Messages.getString("Character"), Messages.getString("Group"), Messages.getString("Sequence"), Messages.getString("Period"), Messages.getString("Directional"), Messages.getString("Start"), Messages.getString("End"), Messages.getString("Radius"), Messages.getString("Height"), Messages.getString("Range"), Messages.getString("Visibility"), Messages.getString("Exhibition") }; SectorTable() { } @Override public String getColumnName(int col) { return headings[col]; } @Override public int getColumnCount() { return headings.length; } @Override public int getRowCount() { if (SmedAction.panelMain == null) return 1; else return SmedAction.panelMain.mark.getSectorCount(); } @Override public boolean isCellEditable(int row, int col) { return ((col > 0) && (row > 0)); } @Override public Class getColumnClass(int col) { switch (col) { case 1: return Col.class; case 6: return Boolean.class; default: return String.class; } } @Override public Object getValueAt(int row, int col) { switch (col) { case 0: if (row == 0) return Messages.getString("Default"); else return row; case 1: if (((String) SmedAction.panelMain.mark.getLightAtt(Att.CHR, row)).contains("Al")) { if (SmedAction.panelMain.mark.getLightAtt(Att.COL, row) == Col.UNKCOL) return Col.UNKCOL; else return SmedAction.panelMain.mark.getLightAtt(Att.ALT, row); } else return SmedAction.panelMain.mark.getLightAtt(Att.COL, row); case 6: return (SmedAction.panelMain.mark.getLightAtt(Att.LIT, row) == Lit.DIR); case 7: case 8: if (SmedAction.panelMain.mark.getLightAtt(Att.LIT, row) == Lit.DIR) return SmedAction.panelMain.mark.getLightAtt(Att.ORT, row); else return SmedAction.panelMain.mark.getLightAtt(col - 1, row); case 12: return visibilities.get(SmedAction.panelMain.mark.getLightAtt(Att.VIS, row)); case 13: return exhibitions.get(SmedAction.panelMain.mark.getLightAtt(Att.EXH, row)); default: return SmedAction.panelMain.mark.getLightAtt(col - 1, row); } } @Override public void setValueAt(Object value, int row, int col) { switch (col) { case 1: for (Col colour : colours.keySet()) { ImageIcon img = colours.get(colour); if (img == value) if (((String) SmedAction.panelMain.mark.getLightAtt(Att.CHR, row)).contains("Al")) { if (((colour == Col.UNKCOL) && (SmedAction.panelMain.mark.getLightAtt(Att.ALT, row) == Col.UNKCOL)) || (SmedAction.panelMain.mark.getLightAtt(Att.COL, row) == Col.UNKCOL)) { SmedAction.panelMain.mark.setLightAtt(Att.COL, row, colour); } else { SmedAction.panelMain.mark.setLightAtt(Att.ALT, row, colour); } } else { SmedAction.panelMain.mark.setLightAtt(Att.COL, row, colour); } } break; case 5: case 9: case 10: case 11: SmedAction.panelMain.mark.setLightAtt(col - 1, row, value); break; case 6: if ((Boolean) value == true) { SmedAction.panelMain.mark.setLightAtt(Att.LIT, row, Lit.DIR); SmedAction.panelMain.mark.setLightAtt(Att.BEG, row, ""); SmedAction.panelMain.mark.setLightAtt(Att.END, row, ""); } else { SmedAction.panelMain.mark.setLightAtt(Att.LIT, row, Lit.UNKLIT); SmedAction.panelMain.mark.setLightAtt(Att.ORT, row, ""); } break; case 7: case 8: if (SmedAction.panelMain.mark.getLightAtt(Att.LIT, row) == Lit.DIR) { SmedAction.panelMain.mark.setLightAtt(Att.ORT, row, value); } else { SmedAction.panelMain.mark.setLightAtt(col - 1, row, value); } break; case 12: for (Vis vis : visibilities.keySet()) { String str = visibilities.get(vis); if (str.equals(value)) { SmedAction.panelMain.mark.setLightAtt(Att.VIS, row, vis); } } break; case 13: for (Exh exh : exhibitions.keySet()) { String str = exhibitions.get(exh); if (str.equals(value)) { SmedAction.panelMain.mark.setLightAtt(Att.EXH, row, exh); } } break; default: SmedAction.panelMain.mark.setLightAtt(col - 1, row, value); } } } static class CentreRenderer extends DefaultTableCellRenderer { CentreRenderer() { super(); setHorizontalAlignment(SwingConstants.CENTER); } } public static class ColourCellRenderer extends JPanel implements TableCellRenderer { private JLabel col1Label; private JLabel col2Label; public ColourCellRenderer() { super(); setLayout(new GridLayout(1, 2, 0, 0)); col1Label = new JLabel(); col1Label.setOpaque(true); add(col1Label); col2Label = new JLabel(); col2Label.setOpaque(true); add(col2Label); } @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int rowIndex, int vColIndex) { if (!((String) SmedAction.panelMain.mark.getLightAtt(Att.CHR, rowIndex)).contains("Al")) { col2Label.setBackground(SeaMark.ColMAP.get(SmedAction.panelMain.mark.getLightAtt(Att.COL, rowIndex))); } else { col2Label.setBackground(SeaMark.ColMAP.get(SmedAction.panelMain.mark.getLightAtt(Att.ALT, rowIndex))); } col1Label.setBackground(SeaMark.ColMAP.get(SmedAction.panelMain.mark.getLightAtt(Att.COL, rowIndex))); return this; } } public int getSectorCount() { return model.getRowCount(); } public void addSector(int idx) { SmedAction.panelMain.mark.addLight(idx); table.setSize(860, ((table.getRowCount() * 16) + 28)); if (table.getRowCount() > 3) { setSize(900, ((table.getRowCount() * 16) + 48)); } else { setSize(900, 100); } } public void deleteSector(int idx) { if (idx > 0) { SmedAction.panelMain.mark.delLight(idx); table.setSize(860, ((table.getRowCount() * 16) + 28)); if (table.getRowCount() > 3) { setSize(900, ((table.getRowCount() * 16) + 48)); } else { setSize(900, 100); } } } public void syncPanel() { table.updateUI(); table.setSize(860, ((table.getRowCount() * 16) + 28)); if (table.getRowCount() > 3) { setSize(900, ((table.getRowCount() * 16) + 48)); } else { setSize(900, 100); } } private void addColItem(ImageIcon img, Col col) { colours.put(col, img); colourBox.addItem(img); } private void addVisibItem(String str, Vis vis) { visibilities.put(vis, str); visibilityBox.addItem(str); } private void addExhibItem(String str, Exh exh) { exhibitions.put(exh, str); exhibitionBox.addItem(str); } }