414 lines
10 KiB
Java
414 lines
10 KiB
Java
/*
|
|
* Copyright © 2011 Keith Packard <keithp@keithp.com>
|
|
*
|
|
* 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; 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
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along
|
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
*/
|
|
|
|
package org.altusmetrum.altosuilib_14;
|
|
|
|
import java.awt.*;
|
|
import java.text.*;
|
|
import java.awt.event.*;
|
|
import javax.swing.*;
|
|
import java.util.*;
|
|
import org.altusmetrum.altoslib_14.*;
|
|
|
|
class AltosEditFreqUI extends AltosUIDialog implements ActionListener {
|
|
Frame frame;
|
|
JTextField frequency;
|
|
JTextField description;
|
|
JButton ok_button, cancel_button;
|
|
boolean got_ok;
|
|
|
|
public void actionPerformed(ActionEvent e) {
|
|
String cmd = e.getActionCommand();
|
|
|
|
if ("ok".equals(cmd)) {
|
|
got_ok = true;
|
|
setVisible(false);
|
|
}
|
|
if ("cancel".equals(cmd)) {
|
|
got_ok = false;
|
|
setVisible(false);
|
|
}
|
|
}
|
|
|
|
public AltosFrequency get() {
|
|
if (!got_ok)
|
|
return null;
|
|
|
|
String f_s = frequency.getText();
|
|
String d_s = description.getText();
|
|
|
|
try {
|
|
double f_d = AltosParse.parse_double_locale(f_s);
|
|
|
|
return new AltosFrequency(f_d, d_s);
|
|
} catch (ParseException ne) {
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public AltosEditFreqUI(Frame in_frame, AltosFrequency existing) {
|
|
super(in_frame, true);
|
|
|
|
got_ok = false;
|
|
frame = in_frame;
|
|
|
|
Container pane = getScrollablePane();
|
|
pane.setLayout(new GridBagLayout());
|
|
|
|
GridBagConstraints c = new GridBagConstraints();
|
|
c.insets = new Insets (4,4,4,4);
|
|
|
|
c.fill = GridBagConstraints.NONE;
|
|
c.anchor = GridBagConstraints.WEST;
|
|
c.gridx = 0;
|
|
c.gridy = 0;
|
|
c.gridwidth = 1;
|
|
c.gridheight = 1;
|
|
c.weightx = 0;
|
|
c.weighty = 0;
|
|
pane.add(new JLabel("Frequency"), c);
|
|
|
|
frequency = new JTextField(12);
|
|
c.fill = GridBagConstraints.NONE;
|
|
c.anchor = GridBagConstraints.WEST;
|
|
c.gridx = 1;
|
|
c.gridy = 0;
|
|
c.gridwidth = 1;
|
|
c.gridheight = 1;
|
|
c.weightx = 0;
|
|
c.weighty = 0;
|
|
pane.add(frequency, c);
|
|
|
|
c.fill = GridBagConstraints.NONE;
|
|
c.anchor = GridBagConstraints.WEST;
|
|
c.gridx = 0;
|
|
c.gridy = 1;
|
|
c.gridwidth = 1;
|
|
c.gridheight = 1;
|
|
c.weightx = 0;
|
|
c.weighty = 0;
|
|
pane.add(new JLabel("Description"), c);
|
|
|
|
description = new JTextField(12);
|
|
c.fill = GridBagConstraints.NONE;
|
|
c.anchor = GridBagConstraints.WEST;
|
|
c.gridx = 1;
|
|
c.gridy = 1;
|
|
c.gridwidth = 1;
|
|
c.gridheight = 1;
|
|
c.weightx = 0;
|
|
c.weighty = 0;
|
|
pane.add(description, c);
|
|
|
|
ok_button = new JButton("OK");
|
|
ok_button.setActionCommand("ok");
|
|
ok_button.addActionListener(this);
|
|
c.fill = GridBagConstraints.NONE;
|
|
c.anchor = GridBagConstraints.WEST;
|
|
c.gridx = 0;
|
|
c.gridy = 2;
|
|
c.gridwidth = 1;
|
|
c.gridheight = 1;
|
|
c.weightx = 0;
|
|
c.weighty = 0;
|
|
pane.add(ok_button, c);
|
|
|
|
cancel_button = new JButton("Cancel");
|
|
cancel_button.setActionCommand("cancel");
|
|
cancel_button.addActionListener(this);
|
|
c.fill = GridBagConstraints.NONE;
|
|
c.anchor = GridBagConstraints.WEST;
|
|
c.gridx = 1;
|
|
c.gridy = 2;
|
|
c.gridwidth = 1;
|
|
c.gridheight = 1;
|
|
c.weightx = 0;
|
|
c.weighty = 0;
|
|
pane.add(cancel_button, c);
|
|
|
|
if (existing == null)
|
|
setTitle("Add New Frequency");
|
|
else {
|
|
setTitle("Edit Existing Frequency");
|
|
frequency.setText(String.format("%7.3f", existing.frequency));
|
|
description.setText(existing.description);
|
|
}
|
|
getRootPane().setDefaultButton(ok_button);
|
|
|
|
pack();
|
|
setLocationRelativeTo(frame);
|
|
|
|
}
|
|
|
|
public AltosEditFreqUI(Frame in_frame) {
|
|
this(in_frame, (AltosFrequency) null);
|
|
}
|
|
}
|
|
|
|
public class AltosConfigFreqUI extends AltosUIDialog implements ActionListener {
|
|
|
|
Frame frame;
|
|
LinkedList<ActionListener> listeners;
|
|
|
|
class FrequencyList extends JList<AltosFrequency> {
|
|
DefaultListModel<AltosFrequency> list_model;
|
|
|
|
public void add(AltosFrequency frequency) {
|
|
int i;
|
|
for (i = 0; i < list_model.size(); i++) {
|
|
AltosFrequency f = (AltosFrequency) list_model.get(i);
|
|
if (frequency.frequency == f.frequency)
|
|
return;
|
|
if (frequency.frequency < f.frequency)
|
|
break;
|
|
}
|
|
list_model.insertElementAt(frequency, i);
|
|
}
|
|
|
|
public void remove(AltosFrequency frequency) {
|
|
list_model.removeElement(frequency);
|
|
}
|
|
|
|
//Subclass JList to workaround bug 4832765, which can cause the
|
|
//scroll pane to not let the user easily scroll up to the beginning
|
|
//of the list. An alternative would be to set the unitIncrement
|
|
//of the JScrollBar to a fixed value. You wouldn't get the nice
|
|
//aligned scrolling, but it should work.
|
|
public int getScrollableUnitIncrement(Rectangle visibleRect,
|
|
int orientation,
|
|
int direction) {
|
|
int row;
|
|
if (orientation == SwingConstants.VERTICAL &&
|
|
direction < 0 && (row = getFirstVisibleIndex()) != -1) {
|
|
Rectangle r = getCellBounds(row, row);
|
|
if ((r.y == visibleRect.y) && (row != 0)) {
|
|
Point loc = r.getLocation();
|
|
loc.y--;
|
|
int prevIndex = locationToIndex(loc);
|
|
Rectangle prevR = getCellBounds(prevIndex, prevIndex);
|
|
|
|
if (prevR == null || prevR.y >= r.y) {
|
|
return 0;
|
|
}
|
|
return prevR.height;
|
|
}
|
|
}
|
|
return super.getScrollableUnitIncrement(
|
|
visibleRect, orientation, direction);
|
|
}
|
|
|
|
public AltosFrequency selected() {
|
|
AltosFrequency f = (AltosFrequency) getSelectedValue();
|
|
return f;
|
|
}
|
|
|
|
public AltosFrequency[] frequencies() {
|
|
AltosFrequency[] ret;
|
|
|
|
ret = new AltosFrequency[list_model.size()];
|
|
for (int i = 0; i < list_model.size(); i++)
|
|
ret[i] = (AltosFrequency) list_model.get(i);
|
|
return ret;
|
|
}
|
|
|
|
public FrequencyList(AltosFrequency[] in_frequencies) {
|
|
list_model = new DefaultListModel<AltosFrequency>();
|
|
setModel(list_model);
|
|
setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
|
|
setLayoutOrientation(JList.HORIZONTAL_WRAP);
|
|
for (int i = 0; i < in_frequencies.length; i++) {
|
|
add(in_frequencies[i]);
|
|
}
|
|
setVisibleRowCount(in_frequencies.length);
|
|
}
|
|
}
|
|
|
|
FrequencyList frequencies;
|
|
|
|
void save_frequencies() {
|
|
AltosUIPreferences.set_common_frequencies(frequencies.frequencies());
|
|
}
|
|
|
|
JButton add, edit, remove;
|
|
|
|
JButton cancel, ok;
|
|
|
|
public void actionPerformed(ActionEvent e) {
|
|
String cmd = e.getActionCommand();
|
|
|
|
if ("ok".equals(cmd)) {
|
|
save_frequencies();
|
|
setVisible(false);
|
|
} else if ("cancel".equals(cmd)) {
|
|
setVisible(false);
|
|
} else if ("add".equals(cmd)) {
|
|
AltosEditFreqUI ui = new AltosEditFreqUI(frame);
|
|
ui.setVisible(true);
|
|
AltosFrequency f = ui.get();
|
|
if (f != null)
|
|
frequencies.add(f);
|
|
} else if ("edit".equals(cmd)) {
|
|
AltosFrequency old_f = frequencies.selected();
|
|
if (old_f == null)
|
|
return;
|
|
AltosEditFreqUI ui = new AltosEditFreqUI(frame, old_f);
|
|
ui.setVisible(true);
|
|
AltosFrequency new_f = ui.get();
|
|
if (new_f != null) {
|
|
if (old_f != null)
|
|
frequencies.remove(old_f);
|
|
frequencies.add(new_f);
|
|
}
|
|
} else if ("remove".equals(cmd)) {
|
|
AltosFrequency old_f = frequencies.selected();
|
|
if (old_f == null)
|
|
return;
|
|
int ret = JOptionPane.showConfirmDialog(this,
|
|
String.format("Remove frequency \"%s\"?",
|
|
old_f.toShortString()),
|
|
"Remove Frequency",
|
|
JOptionPane.YES_NO_OPTION);
|
|
if (ret == JOptionPane.YES_OPTION)
|
|
frequencies.remove(old_f);
|
|
}
|
|
}
|
|
|
|
public AltosFrequency[] frequencies() {
|
|
return frequencies.frequencies();
|
|
}
|
|
|
|
public AltosConfigFreqUI(Frame in_frame,
|
|
AltosFrequency[] in_frequencies) {
|
|
super(in_frame, "Manage Frequencies", true);
|
|
|
|
frame = in_frame;
|
|
|
|
listeners = new LinkedList<ActionListener>();
|
|
|
|
frequencies = new FrequencyList(in_frequencies);
|
|
|
|
Container pane = getScrollablePane();
|
|
pane.setLayout(new GridBagLayout());
|
|
|
|
GridBagConstraints c = new GridBagConstraints();
|
|
c.insets = new Insets(4,4,4,4);
|
|
|
|
/*
|
|
* Frequencies label and list
|
|
*/
|
|
c.fill = GridBagConstraints.NONE;
|
|
c.anchor = GridBagConstraints.WEST;
|
|
c.gridx = 0;
|
|
c.gridy = 0;
|
|
c.gridwidth = 1;
|
|
c.gridheight = 1;
|
|
c.weightx = 0;
|
|
c.weighty = 0;
|
|
pane.add(new JLabel("Frequencies"), c);
|
|
|
|
JScrollPane list_scroller = new JScrollPane(frequencies);
|
|
list_scroller.setAlignmentX(LEFT_ALIGNMENT);
|
|
c.fill = GridBagConstraints.BOTH;
|
|
c.anchor = GridBagConstraints.WEST;
|
|
c.gridx = 0;
|
|
c.gridy = 1;
|
|
c.gridwidth = 6;
|
|
c.gridheight = 2;
|
|
c.weightx = 1;
|
|
c.weighty = 1;
|
|
pane.add(list_scroller, c);
|
|
|
|
add = new JButton("Add");
|
|
add.setActionCommand("add");
|
|
add.addActionListener(this);
|
|
c.fill = GridBagConstraints.NONE;
|
|
c.anchor = GridBagConstraints.CENTER;
|
|
c.gridx = 0;
|
|
c.gridy = 3;
|
|
c.gridwidth = 2;
|
|
c.gridheight = 1;
|
|
c.weightx = 0;
|
|
c.weighty = 0;
|
|
pane.add(add, c);
|
|
|
|
edit = new JButton("Edit");
|
|
edit.setActionCommand("edit");
|
|
edit.addActionListener(this);
|
|
c.fill = GridBagConstraints.NONE;
|
|
c.anchor = GridBagConstraints.CENTER;
|
|
c.gridx = 2;
|
|
c.gridy = 3;
|
|
c.gridwidth = 2;
|
|
c.gridheight = 1;
|
|
c.weightx = 0;
|
|
c.weighty = 0;
|
|
pane.add(edit, c);
|
|
|
|
remove = new JButton("Remove");
|
|
remove.setActionCommand("remove");
|
|
remove.addActionListener(this);
|
|
c.fill = GridBagConstraints.NONE;
|
|
c.anchor = GridBagConstraints.CENTER;
|
|
c.gridx = 4;
|
|
c.gridy = 3;
|
|
c.gridwidth = 2;
|
|
c.gridheight = 1;
|
|
c.weightx = 0;
|
|
c.weighty = 0;
|
|
pane.add(remove, c);
|
|
|
|
ok = new JButton("OK");
|
|
ok.setActionCommand("ok");
|
|
ok.addActionListener(this);
|
|
c.fill = GridBagConstraints.NONE;
|
|
c.anchor = GridBagConstraints.CENTER;
|
|
c.gridx = 0;
|
|
c.gridy = 4;
|
|
c.gridwidth = 3;
|
|
c.gridheight = 1;
|
|
c.weightx = 0;
|
|
c.weighty = 0;
|
|
pane.add(ok, c);
|
|
|
|
cancel = new JButton("Cancel");
|
|
cancel.setActionCommand("cancel");
|
|
cancel.addActionListener(this);
|
|
c.fill = GridBagConstraints.NONE;
|
|
c.anchor = GridBagConstraints.CENTER;
|
|
c.gridx = 3;
|
|
c.gridy = 4;
|
|
c.gridwidth = 3;
|
|
c.gridheight = 1;
|
|
c.weightx = 0;
|
|
c.weighty = 0;
|
|
pane.add(cancel, c);
|
|
|
|
pack();
|
|
setLocationRelativeTo(frame);
|
|
}
|
|
|
|
public static void show(Component frameComp) {
|
|
Frame frame = JOptionPane.getFrameForComponent(frameComp);
|
|
AltosConfigFreqUI dialog;
|
|
|
|
dialog = new AltosConfigFreqUI(frame, AltosUIPreferences.common_frequencies());
|
|
dialog.setVisible(true);
|
|
}
|
|
|
|
}
|