package tim.prune.function.settings; import java.awt.BorderLayout; import java.awt.Component; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.ButtonGroup; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.ListCellRenderer; import javax.swing.border.EtchedBorder; import tim.prune.App; import tim.prune.DataSubscriber; import tim.prune.GenericFunction; import tim.prune.I18nManager; import tim.prune.UpdateMessageBroker; import tim.prune.config.Config; import tim.prune.gui.GuiGridLayout; import tim.prune.gui.WholeNumberField; import tim.prune.gui.map.WpIconLibrary; /** * Class to show the dialog for setting the display settings * like line width, antialiasing, waypoint icons */ public class SetDisplaySettings extends GenericFunction { /** * Inner class to render waypoint icons */ class IconComboRenderer extends JLabel implements ListCellRenderer { /** Cached icons for each waypoint type */ private ImageIcon[] _icons = new ImageIcon[WpIconLibrary.WAYPT_NUMBER_OF_ICONS]; /** Constructor */ IconComboRenderer() { setOpaque(true); } /** Get the label text at the given index */ private String getLabel(int inIndex) { return I18nManager.getText("dialog.displaysettings.wpicon." + WpIconLibrary.getIconName(inIndex)); } /** Get the image icon at the given index */ private ImageIcon getIcon(int inIndex) { if (_icons[inIndex] == null) { _icons[inIndex] = WpIconLibrary.getIconDefinition(inIndex, 1).getImageIcon(); } return _icons[inIndex]; } /** @return a label to display the combo box entry */ public Component getListCellRendererComponent( JList inList, Integer inValue, int inIndex, boolean inSelected, boolean inFocus) { if (inSelected) { setBackground(inList.getSelectionBackground()); setForeground(inList.getSelectionForeground()); } else { setBackground(inList.getBackground()); setForeground(inList.getForeground()); } setIcon(getIcon(inValue)); setText(getLabel(inValue)); return this; } } // Members of SetDisplaySettings private JDialog _dialog = null; private WholeNumberField _lineWidthField = null; private JCheckBox _antialiasCheckbox = null; private JComboBox _wpIconCombobox = null; private JRadioButton[] _sizeRadioButtons = null; private JButton _okButton = null; /** * Constructor * @param inApp app object */ public SetDisplaySettings(App inApp) { super(inApp); } /** * Return the name key for this function */ public String getNameKey() { return "function.setdisplaysettings"; } /** * @return the contents of the window as a Component */ private Component makeContents() { JPanel mainPanel = new JPanel(); mainPanel.setLayout(new BorderLayout(0, 5)); JPanel midPanel = new JPanel(); midPanel.setLayout(new BoxLayout(midPanel, BoxLayout.Y_AXIS)); midPanel.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3)); JPanel linesPanel = new JPanel(); linesPanel.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createEtchedBorder(EtchedBorder.LOWERED), BorderFactory.createEmptyBorder(3, 3, 3, 3)) ); GuiGridLayout grid = new GuiGridLayout(linesPanel); // line width JLabel lineWidthLabel = new JLabel(I18nManager.getText("dialog.displaysettings.linewidth")); grid.add(lineWidthLabel); _lineWidthField = new WholeNumberField(1); grid.add(_lineWidthField); // Antialiasing _antialiasCheckbox = new JCheckBox(I18nManager.getText("dialog.displaysettings.antialias"), false); grid.add(_antialiasCheckbox); grid.add(new JLabel("")); linesPanel.setAlignmentX(Component.CENTER_ALIGNMENT); midPanel.add(linesPanel); midPanel.add(Box.createVerticalStrut(10)); // Panel for waypoint icons JPanel waypointsPanel = new JPanel(); waypointsPanel.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createEtchedBorder(EtchedBorder.LOWERED), BorderFactory.createEmptyBorder(3, 3, 3, 3)) ); waypointsPanel.setLayout(new BoxLayout(waypointsPanel, BoxLayout.Y_AXIS)); // Select which waypoint icon to use JPanel iconPanel = new JPanel(); GuiGridLayout iconGrid = new GuiGridLayout(iconPanel); JLabel headerLabel = new JLabel(I18nManager.getText("dialog.displaysettings.waypointicons")); headerLabel.setAlignmentX(Component.LEFT_ALIGNMENT); iconGrid.add(headerLabel); _wpIconCombobox = new JComboBox(new Integer[] {0, 1, 2, 3, 4}); _wpIconCombobox.setRenderer(new IconComboRenderer()); iconGrid.add(_wpIconCombobox); waypointsPanel.add(iconPanel); // Select size of waypoints JPanel sizePanel = new JPanel(); sizePanel.setLayout(new FlowLayout(FlowLayout.CENTER)); _sizeRadioButtons = new JRadioButton[3]; ButtonGroup sizeRadioGroup = new ButtonGroup(); final String[] sizeKeys = {"small", "medium", "large"}; for (int i=0; i<3; i++) { _sizeRadioButtons[i] = new JRadioButton(I18nManager.getText("dialog.displaysettings.size." + sizeKeys[i])); sizeRadioGroup.add(_sizeRadioButtons[i]); sizePanel.add(_sizeRadioButtons[i]); } waypointsPanel.add(sizePanel); waypointsPanel.setAlignmentX(Component.CENTER_ALIGNMENT); midPanel.add(waypointsPanel); mainPanel.add(midPanel, BorderLayout.CENTER); // button panel at bottom JPanel buttonPanel = new JPanel(); buttonPanel.setLayout(new FlowLayout(FlowLayout.RIGHT)); // OK button _okButton = new JButton(I18nManager.getText("button.ok")); _okButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { finish(); } }); buttonPanel.add(_okButton); // Cancel button JButton cancelButton = new JButton(I18nManager.getText("button.cancel")); cancelButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { _dialog.dispose(); } }); buttonPanel.add(cancelButton); mainPanel.add(buttonPanel, BorderLayout.SOUTH); return mainPanel; } /** * Show window */ public void begin() { if (_dialog == null) { _dialog = new JDialog(_parentFrame, I18nManager.getText(getNameKey())); _dialog.setLocationRelativeTo(_parentFrame); _dialog.getContentPane().add(makeContents()); _dialog.pack(); } // Set values from config int lineWidth = Config.getConfigInt(Config.KEY_LINE_WIDTH); if (lineWidth < 1 || lineWidth > 4) {lineWidth = 2;} _lineWidthField.setValue(lineWidth); _antialiasCheckbox.setSelected(Config.getConfigBoolean(Config.KEY_ANTIALIAS)); _wpIconCombobox.setSelectedIndex(Config.getConfigInt(Config.KEY_WAYPOINT_ICONS)); selectIconSizeRadio(Config.getConfigInt(Config.KEY_WAYPOINT_ICON_SIZE)); _dialog.setVisible(true); } /** * Select the corresponding radio button according to the numeric value * @param inValue numeric value saved in Config */ private void selectIconSizeRadio(int inValue) { if (inValue < 0 || inValue >= _sizeRadioButtons.length) { inValue = 1; } if (_sizeRadioButtons[inValue] != null) { _sizeRadioButtons[inValue].setSelected(true); } } /** * @return numeric value of selected icon size according to radio buttons */ private int getSelectedIconSize() { for (int i=0; i<_sizeRadioButtons.length; i++) { if (_sizeRadioButtons[i] != null && _sizeRadioButtons[i].isSelected()) { return i; } } return 1; // default is medium } /** * Save settings and close */ public void finish() { // update config int lineWidth = _lineWidthField.getValue(); if (lineWidth < 1 || lineWidth > 4) {lineWidth = 2;} Config.setConfigInt(Config.KEY_LINE_WIDTH, lineWidth); Config.setConfigBoolean(Config.KEY_ANTIALIAS, _antialiasCheckbox.isSelected()); Config.setConfigInt(Config.KEY_WAYPOINT_ICONS, _wpIconCombobox.getSelectedIndex()); Config.setConfigInt(Config.KEY_WAYPOINT_ICON_SIZE, getSelectedIconSize()); // refresh display UpdateMessageBroker.informSubscribers(DataSubscriber.MAPSERVER_CHANGED); _dialog.dispose(); } }