1 package tim.prune.function.settings;
3 import java.awt.BorderLayout;
4 import java.awt.Component;
5 import java.awt.FlowLayout;
6 import java.awt.event.ActionEvent;
7 import java.awt.event.ActionListener;
9 import javax.swing.BorderFactory;
10 import javax.swing.Box;
11 import javax.swing.BoxLayout;
12 import javax.swing.ButtonGroup;
13 import javax.swing.ImageIcon;
14 import javax.swing.JButton;
15 import javax.swing.JCheckBox;
16 import javax.swing.JComboBox;
17 import javax.swing.JDialog;
18 import javax.swing.JLabel;
19 import javax.swing.JList;
20 import javax.swing.JPanel;
21 import javax.swing.JRadioButton;
22 import javax.swing.ListCellRenderer;
23 import javax.swing.border.EtchedBorder;
26 import tim.prune.DataSubscriber;
27 import tim.prune.GenericFunction;
28 import tim.prune.I18nManager;
29 import tim.prune.UpdateMessageBroker;
30 import tim.prune.config.Config;
31 import tim.prune.gui.GuiGridLayout;
32 import tim.prune.gui.WholeNumberField;
33 import tim.prune.gui.map.WpIconLibrary;
36 * Class to show the dialog for setting the display settings
37 * like line width, antialiasing, waypoint icons
39 public class SetDisplaySettings extends GenericFunction
42 * Inner class to render waypoint icons
44 class IconComboRenderer extends JLabel implements ListCellRenderer<Integer>
46 /** Cached icons for each waypoint type */
47 private ImageIcon[] _icons = new ImageIcon[WpIconLibrary.WAYPT_NUMBER_OF_ICONS];
55 /** Get the label text at the given index */
56 private String getLabel(int inIndex)
58 return I18nManager.getText("dialog.displaysettings.wpicon." + WpIconLibrary.getIconName(inIndex));
61 /** Get the image icon at the given index */
62 private ImageIcon getIcon(int inIndex)
64 if (_icons[inIndex] == null)
66 _icons[inIndex] = WpIconLibrary.getIconDefinition(inIndex, 1).getImageIcon();
68 return _icons[inIndex];
71 /** @return a label to display the combo box entry */
72 public Component getListCellRendererComponent(
73 JList<? extends Integer> inList, Integer inValue, int inIndex,
74 boolean inSelected, boolean inFocus)
77 setBackground(inList.getSelectionBackground());
78 setForeground(inList.getSelectionForeground());
80 setBackground(inList.getBackground());
81 setForeground(inList.getForeground());
83 setIcon(getIcon(inValue));
84 setText(getLabel(inValue));
90 // Members of SetDisplaySettings
91 private JDialog _dialog = null;
92 private WholeNumberField _lineWidthField = null;
93 private JCheckBox _antialiasCheckbox = null;
94 private JComboBox<Integer> _wpIconCombobox = null;
95 private JRadioButton[] _sizeRadioButtons = null;
96 private JButton _okButton = null;
101 * @param inApp app object
103 public SetDisplaySettings(App inApp)
109 * Return the name key for this function
111 public String getNameKey()
113 return "function.setdisplaysettings";
117 * @return the contents of the window as a Component
119 private Component makeContents()
121 JPanel mainPanel = new JPanel();
122 mainPanel.setLayout(new BorderLayout(0, 5));
123 JPanel midPanel = new JPanel();
124 midPanel.setLayout(new BoxLayout(midPanel, BoxLayout.Y_AXIS));
125 midPanel.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3));
127 JPanel linesPanel = new JPanel();
128 linesPanel.setBorder(BorderFactory.createCompoundBorder(
129 BorderFactory.createEtchedBorder(EtchedBorder.LOWERED), BorderFactory.createEmptyBorder(3, 3, 3, 3))
131 GuiGridLayout grid = new GuiGridLayout(linesPanel);
134 JLabel lineWidthLabel = new JLabel(I18nManager.getText("dialog.displaysettings.linewidth"));
135 grid.add(lineWidthLabel);
136 _lineWidthField = new WholeNumberField(1);
137 grid.add(_lineWidthField);
139 _antialiasCheckbox = new JCheckBox(I18nManager.getText("dialog.displaysettings.antialias"), false);
140 grid.add(_antialiasCheckbox);
141 grid.add(new JLabel(""));
143 linesPanel.setAlignmentX(Component.CENTER_ALIGNMENT);
144 midPanel.add(linesPanel);
145 midPanel.add(Box.createVerticalStrut(10));
147 // Panel for waypoint icons
148 JPanel waypointsPanel = new JPanel();
149 waypointsPanel.setBorder(BorderFactory.createCompoundBorder(
150 BorderFactory.createEtchedBorder(EtchedBorder.LOWERED), BorderFactory.createEmptyBorder(3, 3, 3, 3))
152 waypointsPanel.setLayout(new BoxLayout(waypointsPanel, BoxLayout.Y_AXIS));
153 // Select which waypoint icon to use
154 JPanel iconPanel = new JPanel();
155 GuiGridLayout iconGrid = new GuiGridLayout(iconPanel);
156 JLabel headerLabel = new JLabel(I18nManager.getText("dialog.displaysettings.waypointicons"));
157 headerLabel.setAlignmentX(Component.LEFT_ALIGNMENT);
158 iconGrid.add(headerLabel);
159 _wpIconCombobox = new JComboBox<Integer>(new Integer[] {0, 1, 2, 3, 4});
160 _wpIconCombobox.setRenderer(new IconComboRenderer());
161 iconGrid.add(_wpIconCombobox);
162 waypointsPanel.add(iconPanel);
163 // Select size of waypoints
164 JPanel sizePanel = new JPanel();
165 sizePanel.setLayout(new FlowLayout(FlowLayout.CENTER));
166 _sizeRadioButtons = new JRadioButton[3];
167 ButtonGroup sizeRadioGroup = new ButtonGroup();
168 final String[] sizeKeys = {"small", "medium", "large"};
169 for (int i=0; i<3; i++)
171 _sizeRadioButtons[i] = new JRadioButton(I18nManager.getText("dialog.displaysettings.size." + sizeKeys[i]));
172 sizeRadioGroup.add(_sizeRadioButtons[i]);
173 sizePanel.add(_sizeRadioButtons[i]);
175 waypointsPanel.add(sizePanel);
176 waypointsPanel.setAlignmentX(Component.CENTER_ALIGNMENT);
177 midPanel.add(waypointsPanel);
179 mainPanel.add(midPanel, BorderLayout.CENTER);
181 // button panel at bottom
182 JPanel buttonPanel = new JPanel();
183 buttonPanel.setLayout(new FlowLayout(FlowLayout.RIGHT));
185 _okButton = new JButton(I18nManager.getText("button.ok"));
186 _okButton.addActionListener(new ActionListener() {
187 public void actionPerformed(ActionEvent e) {
191 buttonPanel.add(_okButton);
193 JButton cancelButton = new JButton(I18nManager.getText("button.cancel"));
194 cancelButton.addActionListener(new ActionListener() {
195 public void actionPerformed(ActionEvent e) {
199 buttonPanel.add(cancelButton);
200 mainPanel.add(buttonPanel, BorderLayout.SOUTH);
212 _dialog = new JDialog(_parentFrame, I18nManager.getText(getNameKey()));
213 _dialog.setLocationRelativeTo(_parentFrame);
214 _dialog.getContentPane().add(makeContents());
217 // Set values from config
218 int lineWidth = Config.getConfigInt(Config.KEY_LINE_WIDTH);
219 if (lineWidth < 1 || lineWidth > 4) {lineWidth = 2;}
220 _lineWidthField.setValue(lineWidth);
221 _antialiasCheckbox.setSelected(Config.getConfigBoolean(Config.KEY_ANTIALIAS));
222 _wpIconCombobox.setSelectedIndex(Config.getConfigInt(Config.KEY_WAYPOINT_ICONS));
223 selectIconSizeRadio(Config.getConfigInt(Config.KEY_WAYPOINT_ICON_SIZE));
224 _dialog.setVisible(true);
228 * Select the corresponding radio button according to the numeric value
229 * @param inValue numeric value saved in Config
231 private void selectIconSizeRadio(int inValue)
233 if (inValue < 0 || inValue >= _sizeRadioButtons.length)
237 if (_sizeRadioButtons[inValue] != null)
239 _sizeRadioButtons[inValue].setSelected(true);
244 * @return numeric value of selected icon size according to radio buttons
246 private int getSelectedIconSize()
248 for (int i=0; i<_sizeRadioButtons.length; i++)
250 if (_sizeRadioButtons[i] != null && _sizeRadioButtons[i].isSelected())
255 return 1; // default is medium
259 * Save settings and close
264 int lineWidth = _lineWidthField.getValue();
265 if (lineWidth < 1 || lineWidth > 4) {lineWidth = 2;}
266 Config.setConfigInt(Config.KEY_LINE_WIDTH, lineWidth);
267 Config.setConfigBoolean(Config.KEY_ANTIALIAS, _antialiasCheckbox.isSelected());
268 Config.setConfigInt(Config.KEY_WAYPOINT_ICONS, _wpIconCombobox.getSelectedIndex());
269 Config.setConfigInt(Config.KEY_WAYPOINT_ICON_SIZE, getSelectedIconSize());
271 UpdateMessageBroker.informSubscribers(DataSubscriber.MAPSERVER_CHANGED);