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 JRadioButton[] _windowStyleRadios = null;
97 private JButton _okButton = null;
99 private static final String STYLEKEY_NIMBUS = "javax.swing.plaf.nimbus.NimbusLookAndFeel";
104 * @param inApp app object
106 public SetDisplaySettings(App inApp)
112 * Return the name key for this function
114 public String getNameKey()
116 return "function.setdisplaysettings";
120 * @return the contents of the window as a Component
122 private Component makeContents()
124 JPanel mainPanel = new JPanel();
125 mainPanel.setLayout(new BorderLayout(0, 5));
126 JPanel midPanel = new JPanel();
127 midPanel.setLayout(new BoxLayout(midPanel, BoxLayout.Y_AXIS));
128 midPanel.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3));
130 JPanel linesPanel = new JPanel();
131 linesPanel.setBorder(BorderFactory.createCompoundBorder(
132 BorderFactory.createEtchedBorder(EtchedBorder.LOWERED), BorderFactory.createEmptyBorder(3, 3, 3, 3))
134 GuiGridLayout grid = new GuiGridLayout(linesPanel);
137 JLabel lineWidthLabel = new JLabel(I18nManager.getText("dialog.displaysettings.linewidth"));
138 grid.add(lineWidthLabel);
139 _lineWidthField = new WholeNumberField(1);
140 grid.add(_lineWidthField);
142 _antialiasCheckbox = new JCheckBox(I18nManager.getText("dialog.displaysettings.antialias"), false);
143 grid.add(_antialiasCheckbox);
144 grid.add(new JLabel(""));
146 linesPanel.setAlignmentX(Component.CENTER_ALIGNMENT);
147 midPanel.add(linesPanel);
148 midPanel.add(Box.createVerticalStrut(10));
150 // Panel for waypoint icons
151 JPanel waypointsPanel = new JPanel();
152 waypointsPanel.setBorder(BorderFactory.createCompoundBorder(
153 BorderFactory.createEtchedBorder(EtchedBorder.LOWERED), BorderFactory.createEmptyBorder(3, 3, 3, 3))
155 waypointsPanel.setLayout(new BoxLayout(waypointsPanel, BoxLayout.Y_AXIS));
156 // Select which waypoint icon to use
157 JPanel iconPanel = new JPanel();
158 GuiGridLayout iconGrid = new GuiGridLayout(iconPanel);
159 JLabel headerLabel = new JLabel(I18nManager.getText("dialog.displaysettings.waypointicons"));
160 headerLabel.setAlignmentX(Component.LEFT_ALIGNMENT);
161 iconGrid.add(headerLabel);
162 _wpIconCombobox = new JComboBox<Integer>(new Integer[] {0, 1, 2, 3, 4});
163 _wpIconCombobox.setRenderer(new IconComboRenderer());
164 iconGrid.add(_wpIconCombobox);
165 waypointsPanel.add(iconPanel);
166 // Select size of waypoints
167 JPanel sizePanel = new JPanel();
168 sizePanel.setLayout(new FlowLayout(FlowLayout.CENTER));
169 _sizeRadioButtons = new JRadioButton[3];
170 ButtonGroup sizeRadioGroup = new ButtonGroup();
171 final String[] sizeKeys = {"small", "medium", "large"};
172 for (int i=0; i<3; i++)
174 _sizeRadioButtons[i] = new JRadioButton(I18nManager.getText("dialog.displaysettings.size." + sizeKeys[i]));
175 sizeRadioGroup.add(_sizeRadioButtons[i]);
176 sizePanel.add(_sizeRadioButtons[i]);
178 waypointsPanel.add(sizePanel);
179 waypointsPanel.setAlignmentX(Component.CENTER_ALIGNMENT);
180 midPanel.add(waypointsPanel);
182 // Panel for window style
183 JPanel windowStylePanel = new JPanel();
184 windowStylePanel.setBorder(BorderFactory.createCompoundBorder(
185 BorderFactory.createEtchedBorder(EtchedBorder.LOWERED), BorderFactory.createEmptyBorder(3, 3, 3, 3))
187 windowStylePanel.setLayout(new FlowLayout(FlowLayout.CENTER));
188 windowStylePanel.add(new JLabel(I18nManager.getText("dialog.displaysettings.windowstyle")));
189 windowStylePanel.add(Box.createHorizontalStrut(10));
190 ButtonGroup styleGroup = new ButtonGroup();
191 final String[] styleKeys = {"default", "nimbus"};
192 _windowStyleRadios = new JRadioButton[2];
193 for (int i=0; i<2; i++)
195 _windowStyleRadios[i] = new JRadioButton(
196 I18nManager.getText("dialog.displaysettings.windowstyle." + styleKeys[i]));
197 styleGroup.add(_windowStyleRadios[i]);
198 windowStylePanel.add(_windowStyleRadios[i]);
200 midPanel.add(windowStylePanel);
201 mainPanel.add(midPanel, BorderLayout.CENTER);
203 // button panel at bottom
204 JPanel buttonPanel = new JPanel();
205 buttonPanel.setLayout(new FlowLayout(FlowLayout.RIGHT));
207 _okButton = new JButton(I18nManager.getText("button.ok"));
208 _okButton.addActionListener(new ActionListener() {
209 public void actionPerformed(ActionEvent e) {
213 buttonPanel.add(_okButton);
215 JButton cancelButton = new JButton(I18nManager.getText("button.cancel"));
216 cancelButton.addActionListener(new ActionListener() {
217 public void actionPerformed(ActionEvent e) {
221 buttonPanel.add(cancelButton);
222 mainPanel.add(buttonPanel, BorderLayout.SOUTH);
234 _dialog = new JDialog(_parentFrame, I18nManager.getText(getNameKey()));
235 _dialog.setLocationRelativeTo(_parentFrame);
236 _dialog.getContentPane().add(makeContents());
239 // Set values from config
240 int lineWidth = Config.getConfigInt(Config.KEY_LINE_WIDTH);
241 if (lineWidth < 1 || lineWidth > 4) {lineWidth = 2;}
242 _lineWidthField.setValue(lineWidth);
243 _antialiasCheckbox.setSelected(Config.getConfigBoolean(Config.KEY_ANTIALIAS));
244 _wpIconCombobox.setSelectedIndex(Config.getConfigInt(Config.KEY_WAYPOINT_ICONS));
245 selectIconSizeRadio(Config.getConfigInt(Config.KEY_WAYPOINT_ICON_SIZE));
246 selectWindowStyleRadio(Config.getConfigString(Config.KEY_WINDOW_STYLE));
247 _dialog.setVisible(true);
251 * Select the corresponding radio button according to the numeric value
252 * @param inValue numeric value saved in Config
254 private void selectIconSizeRadio(int inValue)
256 if (inValue < 0 || inValue >= _sizeRadioButtons.length)
260 if (_sizeRadioButtons[inValue] != null)
262 _sizeRadioButtons[inValue].setSelected(true);
267 * Select the corresponding radio button according to the selected style
268 * @param inValue style string saved in Config
270 private void selectWindowStyleRadio(String inValue)
272 int selectedRadio = 0;
273 if (inValue != null && inValue.equals(STYLEKEY_NIMBUS))
277 _windowStyleRadios[selectedRadio].setSelected(true);
281 * @return numeric value of selected icon size according to radio buttons
283 private int getSelectedIconSize()
285 for (int i=0; i<_sizeRadioButtons.length; i++)
287 if (_sizeRadioButtons[i] != null && _sizeRadioButtons[i].isSelected())
292 return 1; // default is medium
296 * Save settings and close
301 int lineWidth = _lineWidthField.getValue();
302 if (lineWidth < 1 || lineWidth > 4) {lineWidth = 2;}
303 Config.setConfigInt(Config.KEY_LINE_WIDTH, lineWidth);
304 Config.setConfigBoolean(Config.KEY_ANTIALIAS, _antialiasCheckbox.isSelected());
305 Config.setConfigInt(Config.KEY_WAYPOINT_ICONS, _wpIconCombobox.getSelectedIndex());
306 Config.setConfigInt(Config.KEY_WAYPOINT_ICON_SIZE, getSelectedIconSize());
307 final String styleString = (_windowStyleRadios[1].isSelected() ? STYLEKEY_NIMBUS : null);
308 Config.setConfigString(Config.KEY_WINDOW_STYLE, styleString);
310 UpdateMessageBroker.informSubscribers(DataSubscriber.MAPSERVER_CHANGED);