X-Git-Url: http://gitweb.fperrin.net/?p=GpsPrune.git;a=blobdiff_plain;f=tim%2Fprune%2Ffunction%2Fsettings%2FSetDisplaySettings.java;fp=tim%2Fprune%2Ffunction%2Fsettings%2FSetDisplaySettings.java;h=63286c5e86dcddce24736afe427a4bfc410bcb97;hp=0000000000000000000000000000000000000000;hb=92dad5df664287acb51728e9ea599f150765d34a;hpb=81843c3d8d0771bf00d0f26034a13aa515465c78 diff --git a/tim/prune/function/settings/SetDisplaySettings.java b/tim/prune/function/settings/SetDisplaySettings.java new file mode 100644 index 0000000..63286c5 --- /dev/null +++ b/tim/prune/function/settings/SetDisplaySettings.java @@ -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 + { + /** 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(); + } +}