// License: GPL. For details, see LICENSE file. package panels; import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.FocusAdapter; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.util.EnumMap; import javax.swing.BorderFactory; import javax.swing.ButtonGroup; import javax.swing.ImageIcon; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JTextField; import javax.swing.SwingConstants; import messages.Messages; import seamarks.SeaMark.Att; import seamarks.SeaMark.Ent; import seamarks.SeaMark.Exh; import seamarks.SeaMark.Lit; import seamarks.SeaMark.Vis; import smed.SmedAction; public class PanelLit extends JPanel { private SmedAction dlg; public PanelSectors panelSector; public PanelCol panelCol; public PanelChr panelChr; public JLabel groupLabel; public JTextField groupBox; private FocusListener flGroup = new FocusAdapter() { @Override public void focusLost(FocusEvent e) { SmedAction.panelMain.mark.setLightAtt(Att.GRP, 0, groupBox.getText()); } }; public JLabel periodLabel; public JTextField periodBox; private FocusListener flPeriod = new FocusAdapter() { @Override public void focusLost(FocusEvent e) { SmedAction.panelMain.mark.setLightAtt(Att.PER, 0, periodBox.getText()); } }; public JLabel sequenceLabel; public JTextField sequenceBox; private FocusListener flSequence = new FocusAdapter() { @Override public void focusLost(FocusEvent e) { SmedAction.panelMain.mark.setLightAtt(Att.SEQ, 0, sequenceBox.getText()); } }; public JLabel visibilityLabel; public JComboBox<String> visibilityBox; public EnumMap<Vis, Integer> visibilities = new EnumMap<>(Vis.class); private ActionListener alVisibility = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { for (Vis vis : visibilities.keySet()) { int idx = visibilities.get(vis); if (idx == visibilityBox.getSelectedIndex()) { SmedAction.panelMain.mark.setLightAtt(Att.VIS, 0, vis); } } } }; public JLabel heightLabel; public JTextField heightBox; private FocusListener flHeight = new FocusAdapter() { @Override public void focusLost(FocusEvent e) { SmedAction.panelMain.mark.setLightAtt(Att.HGT, 0, heightBox.getText()); } }; public JLabel rangeLabel; public JTextField rangeBox; private FocusListener flRange = new FocusAdapter() { @Override public void focusLost(FocusEvent e) { SmedAction.panelMain.mark.setLightAtt(Att.RNG, 0, rangeBox.getText()); } }; public JLabel orientationLabel; public JTextField orientationBox; private FocusListener flOrientation = new FocusAdapter() { @Override public void focusLost(FocusEvent e) { SmedAction.panelMain.mark.setLightAtt(Att.ORT, 0, orientationBox.getText()); } }; public JLabel multipleLabel; public JTextField multipleBox; private FocusListener flMultiple = new FocusAdapter() { @Override public void focusLost(FocusEvent e) { SmedAction.panelMain.mark.setLightAtt(Att.MLT, 0, multipleBox.getText()); } }; public JLabel categoryLabel; public JComboBox<String> categoryBox; public EnumMap<Lit, Integer> categories = new EnumMap<>(Lit.class); private ActionListener alCategory = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { for (Lit lit : categories.keySet()) { int idx = categories.get(lit); if (idx == categoryBox.getSelectedIndex()) { SmedAction.panelMain.mark.setLightAtt(Att.LIT, 0, lit); } } if (SmedAction.panelMain.mark.getLightAtt(Att.LIT, 0) == Lit.DIR) { SmedAction.panelMain.mark.setLightAtt(Att.MLT, 0, ""); multipleBox.setText(""); orientationLabel.setVisible(true); orientationBox.setVisible(true); multipleLabel.setVisible(false); multipleBox.setVisible(false); } else if ((SmedAction.panelMain.mark.getLightAtt(Att.LIT, 0) == Lit.VERT) || (SmedAction.panelMain.mark.getLightAtt(Att.LIT, 0) == Lit.HORIZ)) { SmedAction.panelMain.mark.setLightAtt(Att.ORT, 0, ""); orientationBox.setText(""); orientationLabel.setVisible(false); orientationBox.setVisible(false); multipleLabel.setVisible(true); multipleBox.setVisible(true); } else { SmedAction.panelMain.mark.setLightAtt(Att.MLT, 0, ""); multipleBox.setText(""); SmedAction.panelMain.mark.setLightAtt(Att.ORT, 0, ""); orientationBox.setText(""); orientationLabel.setVisible(false); orientationBox.setVisible(false); multipleLabel.setVisible(false); multipleBox.setVisible(false); } } }; public JLabel exhibitionLabel; public JComboBox<String> exhibitionBox; public EnumMap<Exh, Integer> exhibitions = new EnumMap<>(Exh.class); private ActionListener alExhibition = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { for (Exh exh : exhibitions.keySet()) { int idx = exhibitions.get(exh); if (idx == exhibitionBox.getSelectedIndex()) { SmedAction.panelMain.mark.setLightAtt(Att.EXH, 0, exh); } } } }; private ButtonGroup typeButtons; public JRadioButton singleButton; public JRadioButton sectorButton; private ActionListener alType = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { singleButton.setBorderPainted(singleButton.isSelected()); sectorButton.setBorderPainted(sectorButton.isSelected()); if (sectorButton.isSelected()) { panelSector.setVisible(true); } else { panelSector.setVisible(false); while (SmedAction.panelMain.mark.getSectorCount() > 1) { SmedAction.panelMain.mark.delLight(1); } } } }; public PanelLit(SmedAction dia) { dlg = dia; setLayout(null); panelCol = new PanelCol(dlg, Ent.LIGHT); panelCol.setBounds(new Rectangle(0, 0, 34, 160)); panelChr = new PanelChr(dlg); panelChr.setBounds(new Rectangle(34, 0, 88, 160)); add(panelChr); add(panelCol); panelSector = new PanelSectors(dlg); panelSector.setVisible(false); typeButtons = new ButtonGroup(); singleButton = new JRadioButton(new ImageIcon(getClass().getResource("/images/SingleButton.png"))); add(getTypeButton(singleButton, 280, 125, 34, 30, "Single")); sectorButton = new JRadioButton(new ImageIcon(getClass().getResource("/images/SectorButton.png"))); add(getTypeButton(sectorButton, 315, 125, 34, 30, "Sectored")); groupLabel = new JLabel(Messages.getString("Group"), SwingConstants.CENTER); groupLabel.setBounds(new Rectangle(123, 0, 65, 20)); add(groupLabel); groupBox = new JTextField(); groupBox.setBounds(new Rectangle(135, 20, 40, 20)); groupBox.setHorizontalAlignment(SwingConstants.CENTER); add(groupBox); groupBox.addFocusListener(flGroup); periodLabel = new JLabel(Messages.getString("Period"), SwingConstants.CENTER); periodLabel.setBounds(new Rectangle(123, 40, 65, 20)); add(periodLabel); periodBox = new JTextField(); periodBox.setBounds(new Rectangle(135, 60, 40, 20)); periodBox.setHorizontalAlignment(SwingConstants.CENTER); add(periodBox); periodBox.addFocusListener(flPeriod); heightLabel = new JLabel(Messages.getString("Height"), SwingConstants.CENTER); heightLabel.setBounds(new Rectangle(123, 80, 65, 20)); add(heightLabel); heightBox = new JTextField(); heightBox.setBounds(new Rectangle(135, 100, 40, 20)); heightBox.setHorizontalAlignment(SwingConstants.CENTER); add(heightBox); heightBox.addFocusListener(flHeight); rangeLabel = new JLabel(Messages.getString("Range"), SwingConstants.CENTER); rangeLabel.setBounds(new Rectangle(123, 120, 65, 20)); add(rangeLabel); rangeBox = new JTextField(); rangeBox.setBounds(new Rectangle(135, 140, 40, 20)); rangeBox.setHorizontalAlignment(SwingConstants.CENTER); add(rangeBox); rangeBox.addFocusListener(flRange); sequenceLabel = new JLabel(Messages.getString("Sequence"), SwingConstants.CENTER); sequenceLabel.setBounds(new Rectangle(188, 120, 80, 20)); add(sequenceLabel); sequenceBox = new JTextField(); sequenceBox.setBounds(new Rectangle(183, 140, 90, 20)); sequenceBox.setHorizontalAlignment(SwingConstants.CENTER); add(sequenceBox); sequenceBox.addFocusListener(flSequence); categoryLabel = new JLabel(Messages.getString("Category"), SwingConstants.CENTER); categoryLabel.setBounds(new Rectangle(185, 0, 165, 20)); add(categoryLabel); categoryBox = new JComboBox<>(); categoryBox.setBounds(new Rectangle(185, 20, 165, 20)); add(categoryBox); addCatItem("", Lit.UNKLIT); addCatItem(Messages.getString("VertDisp"), Lit.VERT); addCatItem(Messages.getString("HorizDisp"), Lit.HORIZ); addCatItem(Messages.getString("Directional"), Lit.DIR); addCatItem(Messages.getString("Upper"), Lit.UPPER); addCatItem(Messages.getString("Lower"), Lit.LOWER); addCatItem(Messages.getString("Rear"), Lit.REAR); addCatItem(Messages.getString("Front"), Lit.FRONT); addCatItem(Messages.getString("Aero"), Lit.AERO); addCatItem(Messages.getString("AirObstruction"), Lit.AIROBS); addCatItem(Messages.getString("FogDetector"), Lit.FOGDET); addCatItem(Messages.getString("Floodlight"), Lit.FLOOD); addCatItem(Messages.getString("Striplight"), Lit.STRIP); addCatItem(Messages.getString("Subsidiary"), Lit.SUBS); addCatItem(Messages.getString("Spotlight"), Lit.SPOT); addCatItem(Messages.getString("MoireEffect"), Lit.MOIRE); addCatItem(Messages.getString("Emergency"), Lit.EMERG); addCatItem(Messages.getString("Bearing"), Lit.BEAR); categoryBox.addActionListener(alCategory); visibilityLabel = new JLabel(Messages.getString("Visibility"), SwingConstants.CENTER); visibilityLabel.setBounds(new Rectangle(185, 40, 165, 20)); add(visibilityLabel); visibilityBox = new JComboBox<>(); visibilityBox.setBounds(new Rectangle(185, 60, 165, 20)); add(visibilityBox); addVisibItem("", Vis.UNKVIS); addVisibItem(Messages.getString("Intensified"), Vis.INTEN); addVisibItem(Messages.getString("Unintensified"), Vis.UNINTEN); addVisibItem(Messages.getString("PartiallyObscured"), Vis.PARTOBS); visibilityBox.addActionListener(alVisibility); exhibitionLabel = new JLabel(Messages.getString("Exhibition"), SwingConstants.CENTER); exhibitionLabel.setBounds(new Rectangle(280, 80, 70, 20)); add(exhibitionLabel); exhibitionBox = new JComboBox<>(); exhibitionBox.setBounds(new Rectangle(280, 100, 70, 20)); add(exhibitionBox); 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); exhibitionBox.addActionListener(alExhibition); orientationLabel = new JLabel(Messages.getString("Orientation"), SwingConstants.CENTER); orientationLabel.setBounds(new Rectangle(188, 80, 80, 20)); orientationLabel.setVisible(false); add(orientationLabel); orientationBox = new JTextField(); orientationBox.setBounds(new Rectangle(208, 100, 40, 20)); orientationBox.setHorizontalAlignment(SwingConstants.CENTER); orientationBox.setVisible(false); add(orientationBox); orientationBox.addFocusListener(flOrientation); multipleLabel = new JLabel(Messages.getString("Multiplicity"), SwingConstants.CENTER); multipleLabel.setBounds(new Rectangle(188, 80, 80, 20)); multipleLabel.setVisible(false); add(multipleLabel); multipleBox = new JTextField(); multipleBox.setBounds(new Rectangle(208, 100, 40, 20)); multipleBox.setHorizontalAlignment(SwingConstants.CENTER); multipleBox.setVisible(false); add(multipleBox); multipleBox.addFocusListener(flMultiple); } public void syncPanel() { orientationLabel.setVisible(false); orientationBox.setVisible(false); multipleLabel.setVisible(false); multipleBox.setVisible(false); groupBox.setText((String) SmedAction.panelMain.mark.getLightAtt(Att.GRP, 0)); periodBox.setText((String) SmedAction.panelMain.mark.getLightAtt(Att.PER, 0)); sequenceBox.setText((String) SmedAction.panelMain.mark.getLightAtt(Att.SEQ, 0)); heightBox.setText((String) SmedAction.panelMain.mark.getLightAtt(Att.HGT, 0)); rangeBox.setText((String) SmedAction.panelMain.mark.getLightAtt(Att.RNG, 0)); orientationBox.setText((String) SmedAction.panelMain.mark.getLightAtt(Att.ORT, 0)); orientationBox.setVisible(SmedAction.panelMain.mark.getLightAtt(Att.LIT, 0) == Lit.DIR); multipleBox.setText((String) SmedAction.panelMain.mark.getLightAtt(Att.MLT, 0)); multipleBox.setVisible((SmedAction.panelMain.mark.getLightAtt(Att.LIT, 0) == Lit.VERT) || (SmedAction.panelMain.mark.getLightAtt(Att.LIT, 0) == Lit.HORIZ)); for (Vis vis : visibilities.keySet()) { int item = visibilities.get(vis); if (SmedAction.panelMain.mark.getLightAtt(Att.VIS, 0) == vis) { visibilityBox.setSelectedIndex(item); } } for (Lit lit : categories.keySet()) { int item = categories.get(lit); if (SmedAction.panelMain.mark.getLightAtt(Att.LIT, 0) == lit) { categoryBox.setSelectedIndex(item); } } for (Exh exh : exhibitions.keySet()) { int item = exhibitions.get(exh); if (SmedAction.panelMain.mark.getLightAtt(Att.EXH, 0) == exh) { exhibitionBox.setSelectedIndex(item); } } if (SmedAction.panelMain.mark.isSectored()) { singleButton.setBorderPainted(false); sectorButton.setBorderPainted(true); if (isVisible()) { panelSector.setVisible(true); } } else { singleButton.setBorderPainted(true); sectorButton.setBorderPainted(false); panelSector.setVisible(false); while (SmedAction.panelMain.mark.getSectorCount() > 1) { SmedAction.panelMain.mark.delLight(SmedAction.panelMain.mark.getSectorCount() - 1); } } panelCol.syncPanel(); panelChr.syncPanel(); panelSector.syncPanel(); } private void addCatItem(String str, Lit lit) { categories.put(lit, categoryBox.getItemCount()); categoryBox.addItem(str); } private void addVisibItem(String str, Vis vis) { visibilities.put(vis, visibilityBox.getItemCount()); visibilityBox.addItem(str); } private void addExhibItem(String str, Exh exh) { exhibitions.put(exh, exhibitionBox.getItemCount()); exhibitionBox.addItem(str); } private JRadioButton getTypeButton(JRadioButton button, int x, int y, int w, int h, String tip) { button.setBounds(new Rectangle(x, y, w, h)); button.setBorder(BorderFactory.createLoweredBevelBorder()); button.setToolTipText(Messages.getString(tip)); button.addActionListener(alType); typeButtons.add(button); return button; } }