*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
import java.awt.event.*;
import java.beans.*;
import javax.swing.*;
-import javax.swing.filechooser.FileNameExtensionFilter;
-import javax.swing.table.*;
import javax.swing.event.*;
-import java.io.*;
-import java.util.*;
-import java.text.*;
-import java.util.prefs.*;
-import java.util.concurrent.LinkedBlockingQueue;
-import javax.swing.plaf.basic.*;
-
-class DelegatingRenderer implements ListCellRenderer {
-
- // ...
- public static void install(JComboBox comboBox) {
- DelegatingRenderer renderer = new DelegatingRenderer(comboBox);
- renderer.initialise();
- comboBox.setRenderer(renderer);
- }
-
- // ...
- private final JComboBox comboBox;
-
- // ...
- private ListCellRenderer delegate;
-
- // ...
- private DelegatingRenderer(JComboBox comboBox) {
- this.comboBox = comboBox;
- }
-
- // ...
- private void initialise() {
- delegate = new JComboBox().getRenderer();
- comboBox.addPropertyChangeListener("UI", new PropertyChangeListener() {
-
- public void propertyChange(PropertyChangeEvent evt) {
- delegate = new JComboBox().getRenderer();
- }
- });
- }
-
- // ...
- public Component getListCellRendererComponent(JList list,
- Object value, int index, boolean isSelected, boolean cellHasFocus) {
-
- return delegate.getListCellRendererComponent(list,
- ((UIManager.LookAndFeelInfo) value).getName(),
- index, isSelected, cellHasFocus);
- }
-}
+import org.altusmetrum.altosuilib_12.*;
public class AltosConfigureUI
- extends AltosDialog
+ extends AltosUIConfigure
implements DocumentListener
{
- JFrame owner;
AltosVoice voice;
- Container pane;
-
- JRadioButton enable_voice;
- JButton test_voice;
- JButton close;
-
- JButton configure_log;
- JTextField log_directory;
- JLabel callsign_label;
- JTextField callsign_value;
-
- JLabel font_size_label;
- JComboBox font_size_value;
-
- JLabel look_and_feel_label;
- JComboBox look_and_feel_value;
-
- JRadioButton serial_debug;
-
- JButton manage_bluetooth;
- JButton manage_frequencies;
-
- final static String[] font_size_names = { "Small", "Medium", "Large" };
+ public JTextField callsign_value;
+ public JComboBox<String> position_value;
/* DocumentListener interface methods */
- public void changedUpdate(DocumentEvent e) {
- AltosPreferences.set_callsign(callsign_value.getText());
- }
-
public void insertUpdate(DocumentEvent e) {
changedUpdate(e);
}
changedUpdate(e);
}
- public AltosConfigureUI(JFrame in_owner, AltosVoice in_voice) {
- super(in_owner, "Configure AltosUI", false);
-
- GridBagConstraints c;
-
- Insets insets = new Insets(4, 4, 4, 4);
-
- int row = 0;
-
- owner = in_owner;
- voice = in_voice;
- pane = getContentPane();
- pane.setLayout(new GridBagLayout());
-
- c = new GridBagConstraints();
- c.insets = insets;
- c.fill = GridBagConstraints.NONE;
- c.anchor = GridBagConstraints.WEST;
-
- /* Nice label at the top */
- c.gridx = 0;
- c.gridy = row++;
- c.gridwidth = 3;
- c.fill = GridBagConstraints.NONE;
- c.anchor = GridBagConstraints.CENTER;
- pane.add(new JLabel ("Configure AltOS UI"), c);
+ public void changedUpdate(DocumentEvent e) {
+ if (callsign_value != null)
+ AltosUIPreferences.set_callsign(callsign_value.getText());
+ }
- c.gridx = 0;
- c.gridy = row++;
- c.gridwidth = 3;
- c.fill = GridBagConstraints.NONE;
- c.anchor = GridBagConstraints.CENTER;
- pane.add(new JLabel (String.format("AltOS version %s", AltosVersion.version)), c);
+ public void add_voice() {
/* Voice settings */
- c.gridx = 0;
- c.gridy = row;
- c.gridwidth = 1;
- c.fill = GridBagConstraints.NONE;
- c.anchor = GridBagConstraints.WEST;
- pane.add(new JLabel("Voice"), c);
+ pane.add(new JLabel("Voice"), constraints(0, 1));
- enable_voice = new JRadioButton("Enable", AltosPreferences.voice());
+ JRadioButton enable_voice = new JRadioButton("Enable", AltosUIPreferences.voice());
enable_voice.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JRadioButton item = (JRadioButton) e.getSource();
boolean enabled = item.isSelected();
- AltosPreferences.set_voice(enabled);
+ AltosUIPreferences.set_voice(enabled);
if (enabled)
voice.speak_always("Enable voice.");
else
voice.speak_always("Disable voice.");
}
});
- c.gridx = 1;
- c.gridy = row;
- c.gridwidth = 1;
- c.weightx = 1;
- c.fill = GridBagConstraints.NONE;
- c.anchor = GridBagConstraints.WEST;
- pane.add(enable_voice, c);
+ pane.add(enable_voice, constraints(1, 1));
enable_voice.setToolTipText("Enable/Disable all audio in-flight announcements");
- c.gridx = 2;
- c.gridy = row++;
- c.gridwidth = 1;
- c.weightx = 1;
- c.fill = GridBagConstraints.NONE;
- c.anchor = GridBagConstraints.EAST;
- test_voice = new JButton("Test Voice");
+ JButton test_voice = new JButton("Test Voice");
test_voice.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
voice.speak("That's one small step for man; one giant leap for mankind.");
}
});
- pane.add(test_voice, c);
+ pane.add(test_voice, constraints(2, 1));
test_voice.setToolTipText("Play a stock audio clip to check volume");
+ row++;
+ }
- /* Log directory settings */
- c.gridx = 0;
- c.gridy = row;
- c.gridwidth = 1;
- c.fill = GridBagConstraints.NONE;
- c.anchor = GridBagConstraints.WEST;
- pane.add(new JLabel("Log Directory"), c);
-
- configure_log = new JButton(AltosPreferences.logdir().getPath());
- configure_log.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- AltosPreferences.ConfigureLog();
- configure_log.setText(AltosPreferences.logdir().getPath());
- }
- });
- c.gridx = 1;
- c.gridy = row++;
- c.gridwidth = 2;
- c.fill = GridBagConstraints.BOTH;
- c.anchor = GridBagConstraints.WEST;
- pane.add(configure_log, c);
- configure_log.setToolTipText("Which directory flight logs are stored in");
-
+ public void add_callsign() {
/* Callsign setting */
- c.gridx = 0;
- c.gridy = row;
- c.gridwidth = 1;
- c.fill = GridBagConstraints.NONE;
- c.anchor = GridBagConstraints.WEST;
- pane.add(new JLabel("Callsign"), c);
+ pane.add(new JLabel("Callsign"), constraints(0, 1));
- callsign_value = new JTextField(AltosPreferences.callsign());
+ callsign_value = new JTextField(AltosUIPreferences.callsign());
callsign_value.getDocument().addDocumentListener(this);
- c.gridx = 1;
- c.gridy = row++;
- c.gridwidth = 2;
- c.fill = GridBagConstraints.BOTH;
- c.anchor = GridBagConstraints.WEST;
- pane.add(callsign_value, c);
callsign_value.setToolTipText("Callsign sent in packet mode");
+ pane.add(callsign_value, constraints(1, 2, GridBagConstraints.BOTH));
+ row++;
+ }
- /* Font size setting */
- c.gridx = 0;
- c.gridy = row;
- c.gridwidth = 1;
- c.fill = GridBagConstraints.NONE;
- c.anchor = GridBagConstraints.WEST;
- pane.add(new JLabel("Font size"), c);
-
- font_size_value = new JComboBox(font_size_names);
- int font_size = AltosPreferences.font_size();
- font_size_value.setSelectedIndex(font_size - Altos.font_size_small);
- font_size_value.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- int size = font_size_value.getSelectedIndex() + Altos.font_size_small;
-
- AltosPreferences.set_font_size(size);
- }
- });
- c.gridx = 1;
- c.gridy = row++;
- c.gridwidth = 2;
- c.fill = GridBagConstraints.BOTH;
- c.anchor = GridBagConstraints.WEST;
- pane.add(font_size_value, c);
- font_size_value.setToolTipText("Font size used in telemetry window");
-
- /* Look & Feel setting */
- c.gridx = 0;
- c.gridy = row;
- c.gridwidth = 1;
- c.fill = GridBagConstraints.NONE;
- c.anchor = GridBagConstraints.WEST;
- pane.add(new JLabel("Look & feel"), c);
-
- class LookAndFeelRenderer extends BasicComboBoxRenderer implements ListCellRenderer {
-
- public LookAndFeelRenderer() {
- super();
- }
-
- public Component getListCellRendererComponent(
- JList list,
- Object value,
- int index,
- boolean isSelected,
- boolean cellHasFocus)
- {
- super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
- setText(((UIManager.LookAndFeelInfo) value).getName());
- return this;
- }
- }
-
- final UIManager.LookAndFeelInfo[] look_and_feels = UIManager.getInstalledLookAndFeels();
-
- System.out.printf("look_and_feels %d\n", look_and_feels.length);
- look_and_feel_value = new JComboBox(look_and_feels);
-
- DelegatingRenderer.install(look_and_feel_value);
-
- String look_and_feel = AltosPreferences.look_and_feel();
- for (int i = 0; i < look_and_feels.length; i++)
- if (look_and_feel.equals(look_and_feels[i].getClassName()))
- look_and_feel_value.setSelectedIndex(i);
-
- look_and_feel_value.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- int id = look_and_feel_value.getSelectedIndex();
-
- AltosPreferences.set_look_and_feel(look_and_feels[id].getClassName());
- }
- });
- c.gridx = 1;
- c.gridy = row++;
- c.gridwidth = 2;
- c.fill = GridBagConstraints.BOTH;
- c.anchor = GridBagConstraints.WEST;
- pane.add(look_and_feel_value, c);
- look_and_feel_value.setToolTipText("Look&feel used for new windows");
-
- /* Serial debug setting */
- c.gridx = 0;
- c.gridy = row;
- c.gridwidth = 1;
- c.fill = GridBagConstraints.NONE;
- c.anchor = GridBagConstraints.WEST;
- pane.add(new JLabel("Serial Debug"), c);
-
- serial_debug = new JRadioButton("Enable", AltosPreferences.serial_debug());
- serial_debug.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- JRadioButton item = (JRadioButton) e.getSource();
- boolean enabled = item.isSelected();
- AltosPreferences.set_serial_debug(enabled);
- }
- });
- serial_debug.setToolTipText("Enable/Disable USB I/O getting sent to the console");
-
- c.gridx = 1;
- c.gridy = row++;
- c.gridwidth = 3;
- c.fill = GridBagConstraints.NONE;
- c.anchor = GridBagConstraints.WEST;
- pane.add(serial_debug, c);
+ boolean has_bluetooth;
- manage_bluetooth = new JButton("Manage Bluetooth");
+ public void add_bluetooth() {
+ JButton manage_bluetooth = new JButton("Manage Bluetooth");
manage_bluetooth.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
- AltosBTManage.show(owner, Altos.bt_known);
+ AltosBTManage.show(owner, AltosBTKnown.bt_known());
}
});
- c.gridx = 0;
- c.gridy = row;
- c.gridwidth = 2;
- c.fill = GridBagConstraints.NONE;
- c.anchor = GridBagConstraints.WEST;
- pane.add(manage_bluetooth, c);
+ pane.add(manage_bluetooth, constraints(0, 2));
+ /* in the same row as add_frequencies, so don't bump row */
+ has_bluetooth = true;
+ }
- manage_frequencies = new JButton("Manage Frequencies");
+ public void add_frequencies() {
+ JButton manage_frequencies = new JButton("Manage Frequencies");
manage_frequencies.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
AltosConfigFreqUI.show(owner);
}
});
manage_frequencies.setToolTipText("Configure which values are shown in frequency menus");
- c.gridx = 2;
- c.gridx = 2;
- c.gridy = row++;
- c.gridwidth = 2;
- c.fill = GridBagConstraints.NONE;
- c.anchor = GridBagConstraints.WEST;
- pane.add(manage_frequencies, c);
+ if (has_bluetooth)
+ pane.add(manage_frequencies, constraints(2, 1));
+ else
+ pane.add(manage_frequencies, constraints(0, 3));
+ row++;
+ }
- /* And a close button at the bottom */
- close = new JButton("Close");
- close.addActionListener(new ActionListener() {
+ final static String[] position_names = {
+ "Top left",
+ "Top",
+ "Top right",
+ "Left",
+ "Center",
+ "Right",
+ "Bottom left",
+ "Bottom",
+ "Bottom right",
+ };
+
+ public void add_position() {
+ pane.add(new JLabel ("Menu position"), constraints(0, 1));
+
+ position_value = new JComboBox<String>(position_names);
+ position_value.setMaximumRowCount(position_names.length);
+ int position = AltosUIPreferences.position();
+ position_value.setSelectedIndex(position);
+ position_value.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
- setVisible(false);
+ int position = position_value.getSelectedIndex();
+ AltosUIPreferences.set_position(position);
}
});
- c.gridx = 0;
- c.gridy = row++;
- c.gridwidth = 3;
- c.fill = GridBagConstraints.NONE;
- c.anchor = GridBagConstraints.CENTER;
- pane.add(close, c);
+ pane.add(position_value, constraints(1, 2, GridBagConstraints.BOTH));
+ position_value.setToolTipText("Position of main AltosUI window");
+ row++;
+ }
+
+ public AltosConfigureUI(JFrame owner, AltosVoice voice) {
+ super(owner);
- pack();
- setLocationRelativeTo(owner);
- setVisible(true);
+ this.voice = voice;
}
}