]> gitweb.fperrin.net Git - GpsPrune.git/blobdiff - tim/prune/function/settings/SetDisplaySettings.java
Version 19, May 2018
[GpsPrune.git] / tim / prune / function / settings / SetDisplaySettings.java
diff --git a/tim/prune/function/settings/SetDisplaySettings.java b/tim/prune/function/settings/SetDisplaySettings.java
new file mode 100644 (file)
index 0000000..63286c5
--- /dev/null
@@ -0,0 +1,274 @@
+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();
+       }
+}