--- /dev/null
+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<Integer>
+ {
+ /** 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<? extends Integer> 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<Integer> _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<Integer>(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();
+ }
+}