mirror of
https://github.com/DSheirer/sdrtrunk.git
synced 2026-11-09 23:27:24 -05:00
468 lines
14 KiB
Java
468 lines
14 KiB
Java
package alias;
|
|
|
|
import alias.AliasEvent.Event;
|
|
import alias.id.AliasIDType;
|
|
import alias.id.broadcast.BroadcastChannel;
|
|
import alias.id.priority.Priority;
|
|
import audio.broadcast.BroadcastModel;
|
|
import gui.editor.Editor;
|
|
import icon.Icon;
|
|
import icon.IconListCellRenderer;
|
|
import icon.IconManager;
|
|
import net.miginfocom.swing.MigLayout;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
import sample.Listener;
|
|
|
|
import javax.swing.*;
|
|
import javax.swing.event.ChangeEvent;
|
|
import javax.swing.event.ChangeListener;
|
|
import javax.swing.event.TableModelEvent;
|
|
import javax.swing.event.TableModelListener;
|
|
import java.awt.*;
|
|
import java.awt.event.ActionEvent;
|
|
import java.awt.event.ActionListener;
|
|
import java.util.List;
|
|
|
|
public class MultipleAliasEditor extends Editor<List<Alias>>
|
|
implements Listener<AliasEvent>
|
|
{
|
|
private static final long serialVersionUID = 1L;
|
|
private final static Logger mLog = LoggerFactory.getLogger(MultipleAliasEditor.class);
|
|
|
|
private static String HELP_TEXT =
|
|
"<html>Select attributes below to change for all selected aliases</html>";
|
|
|
|
private JLabel mAliasCountLabel;
|
|
private JLabel mAliasCount;
|
|
|
|
private JCheckBox mListCheckBox = new JCheckBox("List");
|
|
private JComboBox<String> mListCombo = new JComboBox<>();
|
|
private JCheckBox mGroupCheckBox = new JCheckBox("Group");
|
|
private JComboBox<String> mGroupCombo = new JComboBox<>();
|
|
private JCheckBox mIconCheckBox = new JCheckBox("Icon");
|
|
private JComboBox<Icon> mIconCombo;
|
|
private JCheckBox mColorCheckBox = new JCheckBox("Color");
|
|
private JButton mButtonColor;
|
|
private JButton mBtnIconManager;
|
|
private JCheckBox mRecordCheckBox = new JCheckBox("Record");
|
|
private JComboBox<Record> mRecordActionCombo = new JComboBox<>(Record.values());
|
|
private JCheckBox mPriorityCheckBox = new JCheckBox("Priority");
|
|
private JSlider mPrioritySlider;
|
|
private JLabel mPrioritySliderLabel;
|
|
private JCheckBox mStreamCheckBox = new JCheckBox("Stream");
|
|
private JComboBox<String> mStreamCombo;
|
|
|
|
private AliasModel mAliasModel;
|
|
private BroadcastModel mBroadcastModel;
|
|
private IconManager mIconManager;
|
|
|
|
public MultipleAliasEditor(AliasModel aliasModel, BroadcastModel broadcastModel, IconManager iconManager)
|
|
{
|
|
mAliasModel = aliasModel;
|
|
mBroadcastModel = broadcastModel;
|
|
mIconManager = iconManager;
|
|
|
|
mAliasModel.addListener(this);
|
|
mIconManager.getModel().addTableModelListener(new TableModelListener()
|
|
{
|
|
@Override
|
|
public void tableChanged(TableModelEvent e)
|
|
{
|
|
refreshIcons();
|
|
}
|
|
});
|
|
|
|
init();
|
|
}
|
|
|
|
public List<Alias> getAliases()
|
|
{
|
|
if (hasItem())
|
|
{
|
|
return (List<Alias>) getItem();
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
public void init()
|
|
{
|
|
setLayout(new MigLayout("fill,wrap 2", "[grow,fill][grow,fill]",
|
|
"[][][][][][][][][][][][][][grow,fill]"));
|
|
|
|
mAliasCountLabel = new JLabel("Alias:");
|
|
add(mAliasCountLabel);
|
|
|
|
mAliasCount = new JLabel("Multiple");
|
|
add(mAliasCount, "span");
|
|
|
|
add(new JSeparator(), "span");
|
|
|
|
add(new JLabel(HELP_TEXT), "span");
|
|
|
|
add(mListCheckBox);
|
|
|
|
mListCombo.setEditable(true);
|
|
add(mListCombo, "wrap");
|
|
|
|
add(mGroupCheckBox);
|
|
|
|
mGroupCombo.setEditable(true);
|
|
add(mGroupCombo, "wrap");
|
|
|
|
add(mColorCheckBox);
|
|
|
|
mButtonColor = new JButton("Select ...");
|
|
mButtonColor.addActionListener(new ActionListener()
|
|
{
|
|
@Override
|
|
public void actionPerformed(ActionEvent e)
|
|
{
|
|
Color newColor = JColorChooser.showDialog(
|
|
MultipleAliasEditor.this,
|
|
"Choose color for this alias", null);
|
|
|
|
if (newColor != null)
|
|
{
|
|
mButtonColor.setForeground(newColor);
|
|
mButtonColor.setBackground(newColor);
|
|
}
|
|
}
|
|
});
|
|
add(mButtonColor, "wrap");
|
|
|
|
add(mIconCheckBox);
|
|
|
|
mIconCombo = new JComboBox<Icon>(mIconManager.getIcons());
|
|
|
|
IconListCellRenderer renderer = new IconListCellRenderer(mIconManager);
|
|
renderer.setPreferredSize(new Dimension(200, 30));
|
|
mIconCombo.setRenderer(renderer);
|
|
add(mIconCombo, "wrap");
|
|
|
|
//Dummy place holder
|
|
add(new JLabel());
|
|
|
|
mBtnIconManager = new JButton("Icon Manager");
|
|
mBtnIconManager.addActionListener(new ActionListener()
|
|
{
|
|
@Override
|
|
public void actionPerformed(ActionEvent arg0)
|
|
{
|
|
mIconManager.showEditor(MultipleAliasEditor.this);
|
|
}
|
|
});
|
|
|
|
add(mBtnIconManager, "span,wrap");
|
|
|
|
add(mRecordCheckBox);
|
|
add(mRecordActionCombo);
|
|
|
|
//Placeholder
|
|
add(new JLabel(" "));
|
|
mPrioritySliderLabel = new JLabel("Audio Priority: " + Priority.MIN_PRIORITY);
|
|
add(mPrioritySliderLabel);
|
|
|
|
add(mPriorityCheckBox);
|
|
|
|
mPrioritySlider = new JSlider(JSlider.HORIZONTAL,
|
|
Priority.MIN_PRIORITY,
|
|
Priority.MAX_PRIORITY + 1,
|
|
Priority.MIN_PRIORITY);
|
|
|
|
mPrioritySlider.setMajorTickSpacing(20);
|
|
mPrioritySlider.setMinorTickSpacing(5);
|
|
mPrioritySlider.setPaintTicks(true);
|
|
mPrioritySlider.setLabelTable(mPrioritySlider.createStandardLabels(25, 25));
|
|
mPrioritySlider.setPaintLabels(true);
|
|
mPrioritySlider.addChangeListener(new ChangeListener()
|
|
{
|
|
@Override
|
|
public void stateChanged(ChangeEvent e)
|
|
{
|
|
int priority = mPrioritySlider.getValue();
|
|
|
|
if (priority > Priority.MAX_PRIORITY)
|
|
{
|
|
mPrioritySliderLabel.setText("Audio Priority: Do Not Monitor");
|
|
}
|
|
else
|
|
{
|
|
mPrioritySliderLabel.setText("Audio Priority: " + mPrioritySlider.getValue());
|
|
}
|
|
}
|
|
});
|
|
mPrioritySlider.setToolTipText(HELP_TEXT);
|
|
|
|
add(mPrioritySlider);
|
|
|
|
add(mStreamCheckBox);
|
|
|
|
mStreamCombo = new JComboBox<String>();
|
|
mStreamCombo.setEditable(true);
|
|
add(mStreamCombo, "wrap");
|
|
|
|
JButton saveButton = new JButton("Save");
|
|
saveButton.addActionListener(new ActionListener()
|
|
{
|
|
@Override
|
|
public void actionPerformed(ActionEvent e)
|
|
{
|
|
save();
|
|
}
|
|
});
|
|
add(saveButton);
|
|
|
|
JButton resetButton = new JButton("Reset");
|
|
resetButton.addActionListener(new ActionListener()
|
|
{
|
|
@Override
|
|
public void actionPerformed(ActionEvent e)
|
|
{
|
|
reset();
|
|
}
|
|
});
|
|
add(resetButton);
|
|
|
|
setModified(false);
|
|
}
|
|
|
|
private void refreshIcons()
|
|
{
|
|
if(mIconCombo != null)
|
|
{
|
|
EventQueue.invokeLater(new Runnable()
|
|
{
|
|
@Override
|
|
public void run()
|
|
{
|
|
mIconCombo.setModel(new DefaultComboBoxModel<>(mIconManager.getIcons()));
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void setItem(List<Alias> item)
|
|
{
|
|
super.setItem(item);
|
|
|
|
StringBuilder sb = new StringBuilder();
|
|
sb.append("Multiple Selected [ ");
|
|
|
|
if (hasItem())
|
|
{
|
|
sb.append(String.valueOf(getAliases().size()));
|
|
}
|
|
else
|
|
{
|
|
sb.append("0");
|
|
}
|
|
|
|
sb.append(" ]");
|
|
|
|
mAliasCount.setText(sb.toString());
|
|
|
|
List<String> listNames = mAliasModel.getListNames();
|
|
listNames.add(0, "");
|
|
mListCombo.setModel(new DefaultComboBoxModel<String>(
|
|
listNames.toArray(new String[listNames.size()])));
|
|
|
|
List<String> groupNames = mAliasModel.getGroupNames();
|
|
groupNames.add(0, "");
|
|
mGroupCombo.setModel(new DefaultComboBoxModel<String>(
|
|
groupNames.toArray(new String[groupNames.size()])));
|
|
|
|
List<String> streamNames = mBroadcastModel.getBroadcastConfigurationNames();
|
|
mStreamCombo.setModel(new DefaultComboBoxModel<String>(streamNames.toArray(new String[streamNames.size()])));
|
|
|
|
mIconCombo.setModel(new DefaultComboBoxModel<>(mIconManager.getIcons()));
|
|
|
|
setCheckBoxesUnselected();
|
|
|
|
setModified(false);
|
|
}
|
|
|
|
private void setCheckBoxesUnselected()
|
|
{
|
|
mListCheckBox.setSelected(false);
|
|
mGroupCheckBox.setSelected(false);
|
|
mColorCheckBox.setSelected(false);
|
|
mIconCheckBox.setSelected(false);
|
|
mRecordCheckBox.setSelected(false);
|
|
mPriorityCheckBox.setSelected(false);
|
|
mStreamCheckBox.setSelected(false);
|
|
}
|
|
|
|
@Override
|
|
public void reset()
|
|
{
|
|
List<String> listNames = mAliasModel.getListNames();
|
|
listNames.add(0, "");
|
|
mListCombo.setModel(new DefaultComboBoxModel<String>(
|
|
listNames.toArray(new String[listNames.size()])));
|
|
|
|
List<String> groupNames = mAliasModel.getGroupNames();
|
|
groupNames.add(0, "");
|
|
mGroupCombo.setModel(new DefaultComboBoxModel<String>(
|
|
groupNames.toArray(new String[groupNames.size()])));
|
|
|
|
mButtonColor.setForeground(getForeground());
|
|
mButtonColor.setBackground(getBackground());
|
|
|
|
super.reset();
|
|
}
|
|
|
|
private boolean hasRequestedChanges()
|
|
{
|
|
return mListCheckBox.isSelected() ||
|
|
mGroupCheckBox.isSelected() ||
|
|
mColorCheckBox.isSelected() ||
|
|
mIconCheckBox.isSelected() ||
|
|
mRecordCheckBox.isSelected() ||
|
|
mPriorityCheckBox.isSelected() ||
|
|
mStreamCheckBox.isSelected();
|
|
}
|
|
|
|
@Override
|
|
public void save()
|
|
{
|
|
if (hasRequestedChanges() && hasItem())
|
|
{
|
|
List<Alias> aliases = getAliases();
|
|
|
|
for (Alias alias : aliases)
|
|
{
|
|
if (mListCheckBox.isSelected())
|
|
{
|
|
String list = null;
|
|
|
|
if (mListCombo.getSelectedItem() != null)
|
|
{
|
|
list = (String) mListCombo.getSelectedItem();
|
|
}
|
|
|
|
alias.setList(list);
|
|
}
|
|
|
|
if (mGroupCheckBox.isSelected())
|
|
{
|
|
String group = null;
|
|
|
|
if (mGroupCombo.getSelectedItem() != null)
|
|
{
|
|
group = (String) mGroupCombo.getSelectedItem();
|
|
}
|
|
|
|
alias.setGroup(group);
|
|
}
|
|
|
|
if (mColorCheckBox.isSelected())
|
|
{
|
|
alias.setColor(mButtonColor.getForeground().getRGB());
|
|
}
|
|
|
|
if (mIconCheckBox.isSelected())
|
|
{
|
|
if (mIconCombo.getSelectedItem() != null)
|
|
{
|
|
alias.setIconName(((Icon)mIconCombo.getSelectedItem()).getName());
|
|
}
|
|
else
|
|
{
|
|
alias.setIconName(null);
|
|
}
|
|
}
|
|
|
|
if (mRecordCheckBox.isSelected())
|
|
{
|
|
Record action =
|
|
(Record) mRecordActionCombo.getSelectedItem();
|
|
|
|
alias.setRecordable(action == Record.RECORDABLE);
|
|
}
|
|
|
|
if (mPriorityCheckBox.isSelected())
|
|
{
|
|
int priority = mPrioritySlider.getValue();
|
|
|
|
//This is a work-around -- we use max priority + 1 in the
|
|
//gui to indicate do not monitor, and change the value here
|
|
if (priority == Priority.MAX_PRIORITY + 1)
|
|
{
|
|
priority = Priority.DO_NOT_MONITOR;
|
|
}
|
|
|
|
alias.setCallPriority(priority);
|
|
}
|
|
|
|
if(mStreamCheckBox.isSelected())
|
|
{
|
|
if(mStreamCombo.getSelectedItem() != null)
|
|
{
|
|
String streamName = (String)mStreamCombo.getSelectedItem();
|
|
|
|
boolean hasChannel = false;
|
|
|
|
//Ensure the alias doesn't already have the channel
|
|
for(BroadcastChannel channel: alias.getBroadcastChannels())
|
|
{
|
|
if(channel.getChannelName().equals(streamName))
|
|
{
|
|
hasChannel = true;
|
|
continue;
|
|
}
|
|
}
|
|
|
|
if(!hasChannel)
|
|
{
|
|
BroadcastChannel channel = (BroadcastChannel)AliasFactory
|
|
.getAliasID(AliasIDType.BROADCAST_CHANNEL);
|
|
|
|
channel.setChannelName(streamName);
|
|
alias.addAliasID(channel);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
for (Alias alias : aliases)
|
|
{
|
|
//Broadcast an alias change event to save the updates
|
|
mAliasModel.broadcast(new AliasEvent(alias, Event.CHANGE));
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void receive(AliasEvent event)
|
|
{
|
|
if (event.getEvent() == Event.DELETE &&
|
|
hasItem() &&
|
|
getAliases().contains(event.getAlias()))
|
|
{
|
|
getAliases().remove(event.getAlias());
|
|
setItem(getAliases());
|
|
}
|
|
}
|
|
|
|
public enum Record
|
|
{
|
|
NON_RECORDABLE("Non-Recordable"),
|
|
RECORDABLE("Recordable");
|
|
|
|
private String mLabel;
|
|
|
|
private Record(String label)
|
|
{
|
|
mLabel = label;
|
|
}
|
|
|
|
public String toString()
|
|
{
|
|
return mLabel;
|
|
}
|
|
}
|
|
}
|