wip: finished alias, alias ID and alias action editing framework.

This commit is contained in:
denny
2016-03-04 09:33:46 -05:00
parent 2c3dbe1b22
commit 00d2b43c2a
68 changed files with 1472 additions and 647 deletions

View File

@@ -27,6 +27,8 @@ import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlSeeAlso; import javax.xml.bind.annotation.XmlSeeAlso;
import alias.action.AliasAction; import alias.action.AliasAction;
import alias.id.AliasID;
import alias.id.AliasIDType;
import alias.id.priority.Priority; import alias.id.priority.Priority;
@XmlSeeAlso( { AliasID.class, AliasAction.class } ) @XmlSeeAlso( { AliasID.class, AliasAction.class } )

View File

@@ -55,11 +55,12 @@ public class AliasController extends JPanel
mAliasModel = aliasModel; mAliasModel = aliasModel;
mEditor = new AliasEditor( mAliasModel, settingsManager ); mEditor = new AliasEditor( mAliasModel, settingsManager );
mAliasModel.addListener( mEditor );
mIconCellRenderer = new IconCellRenderer( settingsManager ); mIconCellRenderer = new IconCellRenderer( settingsManager );
init(); init();
mAliasModel.addListener( mEditor );
} }
private void init() private void init()
@@ -124,7 +125,7 @@ public class AliasController extends JPanel
@Override @Override
public void valueChanged( ListSelectionEvent event ) public void valueChanged( ListSelectionEvent event )
{ {
//This limits event firing to only when selection is complete //Limits event firing to only when selection is complete
if( !event.getValueIsAdjusting() ) if( !event.getValueIsAdjusting() )
{ {
int selectedRow = mAliasTable.getSelectedRow(); int selectedRow = mAliasTable.getSelectedRow();
@@ -137,14 +138,14 @@ public class AliasController extends JPanel
if( alias != null ) if( alias != null )
{ {
mEditor.setAlias( alias ); mEditor.setItem( alias );
mCopyButton.setEnabled( true ); mCopyButton.setEnabled( true );
mDeleteButton.setEnabled( true ); mDeleteButton.setEnabled( true );
} }
} }
else else
{ {
mEditor.setAlias( null ); mEditor.setItem( null );
mCopyButton.setEnabled( false ); mCopyButton.setEnabled( false );
mDeleteButton.setEnabled( false ); mDeleteButton.setEnabled( false );
} }

View File

@@ -17,25 +17,34 @@
******************************************************************************/ ******************************************************************************/
package alias; package alias;
import gui.editor.Editor;
import java.awt.Color; import java.awt.Color;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
import javax.swing.JButton; import javax.swing.JButton;
import javax.swing.JLabel; import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSeparator; import javax.swing.JSeparator;
import net.miginfocom.swing.MigLayout; import net.miginfocom.swing.MigLayout;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sample.Listener; import sample.Listener;
import settings.SettingsManager; import settings.SettingsManager;
import alias.AliasEvent.Event; import alias.AliasEvent.Event;
import alias.action.AliasActionEditor;
import alias.id.AliasIdentifierEditor;
import com.jidesoft.swing.JideTabbedPane; import com.jidesoft.swing.JideTabbedPane;
public class AliasEditor extends JPanel implements ActionListener, Listener<AliasEvent> public class AliasEditor extends Editor<Alias> implements ActionListener, Listener<AliasEvent>
{ {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private final static Logger mLog = LoggerFactory.getLogger( AliasEditor.class );
private static final String DEFAULT_NAME = "select an alias"; private static final String DEFAULT_NAME = "select an alias";
@@ -44,41 +53,44 @@ public class AliasEditor extends JPanel implements ActionListener, Listener<Alia
private JLabel mAliasLabel; private JLabel mAliasLabel;
private AliasNameEditor mAliasNameEditor; private AliasNameEditor mAliasNameEditor;
private AliasIdentifierEditor mAliasIdentifierEditor; private AliasIdentifierEditor mAliasIdentifierEditor;
private AliasActionEditor mAliasActionEditor;
private Alias mAlias;
public AliasEditor( AliasModel aliasModel, SettingsManager settingsManager ) public AliasEditor( AliasModel aliasModel, SettingsManager settingsManager )
{ {
mAliasModel = aliasModel; mAliasModel = aliasModel;
mAliasNameEditor = new AliasNameEditor( mAliasModel, settingsManager ); mAliasNameEditor = new AliasNameEditor( mAliasModel, settingsManager );
mAliasIdentifierEditor = new AliasIdentifierEditor( aliasModel ); mAliasIdentifierEditor = new AliasIdentifierEditor( aliasModel );
mAliasActionEditor = new AliasActionEditor( aliasModel );
mAliasModel.addListener( this ); mAliasModel.addListener( this );
initGUI(); initGUI();
} }
public void setAlias( Alias alias )
{
mAlias = alias;
if( mAlias != null )
{ @Override
mAliasLabel.setText( alias.getName() ); public void setItem( Alias alias )
} {
else super.setItem( alias );
{
if( hasItem() )
{
mAliasLabel.setText( getItem().getName() );
}
else
{
mAliasLabel.setText( DEFAULT_NAME ); mAliasLabel.setText( DEFAULT_NAME );
} }
mAliasNameEditor.setAlias( alias ); mAliasNameEditor.setItem( alias );
mAliasIdentifierEditor.setAlias( alias ); mAliasIdentifierEditor.setItem( alias );
} mAliasActionEditor.setItem( alias );
}
private void initGUI() private void initGUI()
{ {
setLayout( new MigLayout( "fill,wrap 2", "[grow,fill][grow,fill]", "[][][][][grow,fill]" ) ); setLayout( new MigLayout( "fill,wrap 2", "[grow,fill][grow,fill]",
"[][][][][][grow,fill]" ) );
add( new JLabel( "Alias:" ), "align right" ); add( new JLabel( "Alias:" ), "align right" );
mAliasLabel = new JLabel( DEFAULT_NAME ); mAliasLabel = new JLabel( DEFAULT_NAME );
@@ -91,14 +103,18 @@ public class AliasEditor extends JPanel implements ActionListener, Listener<Alia
tabs.setForeground( Color.BLACK ); tabs.setForeground( Color.BLACK );
tabs.addTab( "Alias", mAliasNameEditor ); tabs.addTab( "Alias", mAliasNameEditor );
tabs.addTab( "Identifiers", mAliasIdentifierEditor ); tabs.addTab( "Audio / Identifier", mAliasIdentifierEditor );
add( tabs, "span,grow" ); tabs.addTab( "Action", mAliasActionEditor );
add( tabs, "span,grow" );
//Playlist management buttons
JButton btnSave = new JButton( "Save" ); JButton btnSave = new JButton( "Save" );
btnSave.setToolTipText( "Save alias changes to the playlist" );
btnSave.addActionListener( AliasEditor.this ); btnSave.addActionListener( AliasEditor.this );
add( btnSave ); add( btnSave );
JButton btnReset = new JButton( "Reset" ); JButton btnReset = new JButton( "Reset" );
btnReset.setToolTipText( "Reset alias changes since last save" );
btnReset.addActionListener( AliasEditor.this ); btnReset.addActionListener( AliasEditor.this );
add( btnReset, "wrap" ); add( btnReset, "wrap" );
} }
@@ -107,28 +123,46 @@ public class AliasEditor extends JPanel implements ActionListener, Listener<Alia
public void receive( AliasEvent event ) public void receive( AliasEvent event )
{ {
//If this is the currently displayed alias, reload it //If this is the currently displayed alias, reload it
if( mAlias != null && mAlias == event.getAlias() ) if( hasItem() && getItem() == event.getAlias() )
{ {
setAlias( event.getAlias() ); switch( event.getEvent() )
{
case CHANGE:
//Alias changed - reset the editor with changed alias
setItem( event.getAlias() );
break;
case DELETE:
setItem( null );
break;
default:
break;
}
} }
} }
@Override @Override
public void actionPerformed( ActionEvent e ) public void actionPerformed( ActionEvent e )
{ {
String command = e.getActionCommand(); if( hasItem() )
if( command.contentEquals( "Save" ) )
{ {
mAliasNameEditor.save(); String command = e.getActionCommand();
mAliasIdentifierEditor.save();
//Broadcast an alias change event to save the updates if( command.contentEquals( "Save" ) )
mAliasModel.broadcast( new AliasEvent( mAlias, Event.CHANGE ) ); {
} save();
else if( command.contentEquals( "Reset" ) ) }
{ else if( command.contentEquals( "Reset" ) )
setAlias( mAlias ); {
reset();
}
} }
} }
@Override
public void save()
{
mAliasNameEditor.save();
mAliasIdentifierEditor.save();
mAliasActionEditor.save();
}
} }

View File

@@ -1,17 +1,42 @@
/*******************************************************************************
* SDR Trunk
* Copyright (C) 2014-2016 Dennis Sheirer
*
* 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 3 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, see <http://www.gnu.org/licenses/>
******************************************************************************/
package alias; package alias;
import gui.editor.Editor;
import gui.editor.EmptyEditor;
import alias.action.AliasAction; import alias.action.AliasAction;
import alias.action.AliasActionType;
import alias.action.beep.BeepAction; import alias.action.beep.BeepAction;
import alias.action.beep.BeepActionEditor;
import alias.action.clip.ClipAction; import alias.action.clip.ClipAction;
import alias.action.clip.ClipActionEditor;
import alias.action.script.ScriptAction; import alias.action.script.ScriptAction;
import alias.action.script.ScriptActionEditor;
import alias.id.AliasID;
import alias.id.AliasIDType;
import alias.id.esn.ESNEditor; import alias.id.esn.ESNEditor;
import alias.id.esn.Esn; import alias.id.esn.Esn;
import alias.id.fleetsync.FleetsyncID; import alias.id.fleetsync.FleetsyncID;
import alias.id.fleetsync.FleetsyncIDEditor; import alias.id.fleetsync.FleetsyncIDEditor;
import alias.id.lojack.LoJackIDEditor;
import alias.id.lojack.LoJackFunctionAndID; import alias.id.lojack.LoJackFunctionAndID;
import alias.id.mdc.MDC1200IDEditor; import alias.id.lojack.LoJackIDEditor;
import alias.id.mdc.MDC1200ID; import alias.id.mdc.MDC1200ID;
import alias.id.mdc.MDC1200IDEditor;
import alias.id.mobileID.MINEditor; import alias.id.mobileID.MINEditor;
import alias.id.mobileID.Min; import alias.id.mobileID.Min;
import alias.id.mpt1327.MPT1327ID; import alias.id.mpt1327.MPT1327ID;
@@ -20,8 +45,8 @@ import alias.id.nonrecordable.NonRecordable;
import alias.id.nonrecordable.NonRecordableEditor; import alias.id.nonrecordable.NonRecordableEditor;
import alias.id.priority.Priority; import alias.id.priority.Priority;
import alias.id.priority.PriorityEditor; import alias.id.priority.PriorityEditor;
import alias.id.siteID.SiteIDEditor;
import alias.id.siteID.SiteID; import alias.id.siteID.SiteID;
import alias.id.siteID.SiteIDEditor;
import alias.id.status.StatusID; import alias.id.status.StatusID;
import alias.id.status.StatusIDEditor; import alias.id.status.StatusIDEditor;
import alias.id.talkgroup.TalkgroupID; import alias.id.talkgroup.TalkgroupID;
@@ -158,7 +183,7 @@ public class AliasFactory
return copy; return copy;
} }
public static ComponentEditor<AliasID> getEditor( AliasID aliasID ) public static Editor<AliasID> getEditor( AliasID aliasID )
{ {
if( aliasID != null ) if( aliasID != null )
{ {
@@ -193,28 +218,27 @@ public class AliasFactory
} }
} }
return new EmptyAliasIDEditor(); return new EmptyEditor<AliasID>();
} }
public static ComponentEditor<AliasAction> getEditor( AliasAction aliasAction ) public static Editor<AliasAction> getEditor( AliasAction aliasAction )
{ {
if( aliasAction != null ) if( aliasAction != null )
{ {
if( aliasAction instanceof BeepAction ) switch( aliasAction.getType() )
{ {
case BEEP:
} return new BeepActionEditor( aliasAction );
else if( aliasAction instanceof ClipAction ) case CLIP:
{ return new ClipActionEditor( aliasAction );
case SCRIPT:
} return new ScriptActionEditor( aliasAction );
else if( aliasAction instanceof ScriptAction ) default:
{ break;
} }
} }
return new EmptyAliasActionEditor(); return new EmptyEditor<AliasAction>();
} }
public static AliasID getAliasID( AliasIDType type ) public static AliasID getAliasID( AliasIDType type )
@@ -249,4 +273,20 @@ public class AliasFactory
throw new IllegalArgumentException( "Unrecognized Alias ID type: " + type ); throw new IllegalArgumentException( "Unrecognized Alias ID type: " + type );
} }
} }
public static AliasAction getAliasAction( AliasActionType type )
{
switch( type )
{
case BEEP:
return new BeepAction();
case CLIP:
return new ClipAction();
case SCRIPT:
return new ScriptAction();
default:
throw new IllegalArgumentException( "Unrecognized Alias Action type: " + type );
}
}
} }

View File

@@ -34,6 +34,7 @@ import alias.action.AliasAction;
import alias.action.beep.BeepAction; import alias.action.beep.BeepAction;
import alias.action.clip.ClipAction; import alias.action.clip.ClipAction;
import alias.action.script.ScriptAction; import alias.action.script.ScriptAction;
import alias.id.AliasID;
import alias.id.esn.Esn; import alias.id.esn.Esn;
import alias.id.fleetsync.FleetsyncID; import alias.id.fleetsync.FleetsyncID;
import alias.id.lojack.LoJackFunctionAndID; import alias.id.lojack.LoJackFunctionAndID;

View File

@@ -48,7 +48,7 @@ public class AliasModel extends AbstractTableModel
public static final int COLUMN_ICON = 3; public static final int COLUMN_ICON = 3;
public static final int COLUMN_COLOR = 4; public static final int COLUMN_COLOR = 4;
private List<Alias> mAliases = new ArrayList<>(); private List<Alias> mAliases = new CopyOnWriteArrayList<>();
private Broadcaster<AliasEvent> mAliasEventBroadcaster = new Broadcaster<>(); private Broadcaster<AliasEvent> mAliasEventBroadcaster = new Broadcaster<>();
public AliasModel() public AliasModel()

View File

@@ -1,5 +1,7 @@
package alias; package alias;
import gui.editor.Editor;
import java.awt.Color; import java.awt.Color;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.EventQueue; import java.awt.EventQueue;
@@ -14,17 +16,24 @@ import javax.swing.JColorChooser;
import javax.swing.JComboBox; import javax.swing.JComboBox;
import javax.swing.JLabel; import javax.swing.JLabel;
import javax.swing.JTextField; import javax.swing.JTextField;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import alias.AliasEvent.Event;
import map.IconManager; import map.IconManager;
import map.MapIcon; import map.MapIcon;
import map.MapIconListCellRenderer; import map.MapIconListCellRenderer;
import net.miginfocom.swing.MigLayout; import net.miginfocom.swing.MigLayout;
import settings.SettingsManager; import settings.SettingsManager;
public class AliasNameEditor extends AliasConfigurationEditor public class AliasNameEditor extends Editor<Alias>
{ {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private final static Logger mLog = LoggerFactory.getLogger( AliasNameEditor.class );
private static ComboBoxModel<String> EMPTY_MODEL = new DefaultComboBoxModel<>(); private static ComboBoxModel<String> EMPTY_MODEL = new DefaultComboBoxModel<>();
private JComboBox<String> mListCombo = new JComboBox<>( EMPTY_MODEL ); private JComboBox<String> mListCombo = new JComboBox<>( EMPTY_MODEL );
@@ -34,7 +43,6 @@ public class AliasNameEditor extends AliasConfigurationEditor
private JButton mButtonColor; private JButton mButtonColor;
private JButton mBtnIconManager; private JButton mBtnIconManager;
private Alias mAlias;
private AliasModel mAliasModel; private AliasModel mAliasModel;
private SettingsManager mSettingsManager; private SettingsManager mSettingsManager;
@@ -52,6 +60,23 @@ public class AliasNameEditor extends AliasConfigurationEditor
add( new JLabel( "Name:" ) ); add( new JLabel( "Name:" ) );
mName = new JTextField(); mName = new JTextField();
mName.getDocument().addDocumentListener( new DocumentListener()
{
@Override
public void removeUpdate( DocumentEvent e )
{
setModified( true );
}
@Override
public void insertUpdate( DocumentEvent e )
{
setModified( true );
}
@Override
public void changedUpdate( DocumentEvent e ){}
} );
add( mName, "wrap" ); add( mName, "wrap" );
add( new JLabel( "List:" ) ); add( new JLabel( "List:" ) );
@@ -76,12 +101,22 @@ public class AliasNameEditor extends AliasConfigurationEditor
groups.toArray( new String[ groups.size() ] ) ) );; groups.toArray( new String[ groups.size() ] ) ) );;
} }
} }
setModified( true );
} }
} ); } );
add( mListCombo, "wrap" ); add( mListCombo, "wrap" );
add( new JLabel( "Group:" ) ); add( new JLabel( "Group:" ) );
mGroupCombo.setEditable( true ); mGroupCombo.setEditable( true );
mGroupCombo.addActionListener( new ActionListener()
{
@Override
public void actionPerformed( ActionEvent e )
{
setModified( true );
}
} );
add( mGroupCombo, "wrap" ); add( mGroupCombo, "wrap" );
add( new JLabel( "Color:" ) ); add( new JLabel( "Color:" ) );
@@ -95,12 +130,14 @@ public class AliasNameEditor extends AliasConfigurationEditor
Color newColor = JColorChooser.showDialog( Color newColor = JColorChooser.showDialog(
AliasNameEditor.this, AliasNameEditor.this,
"Choose color for this alias", "Choose color for this alias",
( mAlias != null ? mAlias.getMapColor() : null ) ); ( hasItem() ? getItem().getMapColor() : null ) );
if( newColor != null ) if( newColor != null )
{ {
mButtonColor.setForeground( newColor ); mButtonColor.setForeground( newColor );
mButtonColor.setBackground( newColor ); mButtonColor.setBackground( newColor );
setModified( true );
} }
} }
} ); } );
@@ -113,6 +150,14 @@ public class AliasNameEditor extends AliasConfigurationEditor
MapIconListCellRenderer renderer = new MapIconListCellRenderer(); MapIconListCellRenderer renderer = new MapIconListCellRenderer();
renderer.setPreferredSize( new Dimension( 200, 30 ) ); renderer.setPreferredSize( new Dimension( 200, 30 ) );
mMapIconCombo.setRenderer( renderer ); mMapIconCombo.setRenderer( renderer );
mMapIconCombo.addActionListener( new ActionListener()
{
@Override
public void actionPerformed( ActionEvent e )
{
setModified( true );
}
} );
add( mMapIconCombo, "wrap" ); add( mMapIconCombo, "wrap" );
@@ -138,16 +183,18 @@ public class AliasNameEditor extends AliasConfigurationEditor
} ); } );
} }
} ); } );
add( mBtnIconManager, "span 2,wrap" );
add( mBtnIconManager, "span 2,wrap" );
setModified( false );
} }
@Override @Override
public void setAlias( Alias alias ) public void setItem( Alias alias )
{ {
mAlias = alias; super.setItem( alias );
if( mAlias != null ) if( hasItem() )
{ {
mName.setText( alias.getName() ); mName.setText( alias.getName() );
@@ -163,9 +210,9 @@ public class AliasNameEditor extends AliasConfigurationEditor
listNames.toArray( new String[ listNames.size() ] ) ) );; listNames.toArray( new String[ listNames.size() ] ) ) );;
} }
mListCombo.setSelectedItem( mAlias.getList() ); mListCombo.setSelectedItem( alias.getList() );
List<String> groupNames = mAliasModel.getGroupNames( mAlias.getList() ); List<String> groupNames = mAliasModel.getGroupNames( alias.getList() );
if( groupNames.isEmpty() ) if( groupNames.isEmpty() )
{ {
@@ -177,14 +224,14 @@ public class AliasNameEditor extends AliasConfigurationEditor
groupNames.toArray( new String[ groupNames.size() ] ) ) );; groupNames.toArray( new String[ groupNames.size() ] ) ) );;
} }
mGroupCombo.setSelectedItem( mAlias.getGroup() ); mGroupCombo.setSelectedItem( alias.getGroup() );
Color color = mAlias.getMapColor(); Color color = alias.getMapColor();
mButtonColor.setBackground( color ); mButtonColor.setBackground( color );
mButtonColor.setForeground( color ); mButtonColor.setForeground( color );
String iconName = mAlias.getIconName(); String iconName = alias.getIconName();
if( iconName == null ) if( iconName == null )
{ {
@@ -207,31 +254,40 @@ public class AliasNameEditor extends AliasConfigurationEditor
mButtonColor.setBackground( getBackground() ); mButtonColor.setBackground( getBackground() );
mButtonColor.setForeground( getForeground() ); mButtonColor.setForeground( getForeground() );
} }
setModified( false );
} }
@Override @Override
public void save() public void save()
{ {
if( mAlias != null ) if( hasItem() && isModified() )
{ {
Alias alias = getItem();
if( mListCombo.getSelectedItem() != null ) if( mListCombo.getSelectedItem() != null )
{ {
mAlias.setList( (String)mListCombo.getSelectedItem() ); alias.setList( (String)mListCombo.getSelectedItem() );
} }
if( mGroupCombo.getSelectedItem() != null ) if( mGroupCombo.getSelectedItem() != null )
{ {
mAlias.setGroup( (String)mGroupCombo.getSelectedItem() ); alias.setGroup( (String)mGroupCombo.getSelectedItem() );
} }
mAlias.setName( mName.getText() ); alias.setName( mName.getText() );
mAlias.setColor( mButtonColor.getBackground().getRGB() ); alias.setColor( mButtonColor.getBackground().getRGB() );
if( mMapIconCombo.getSelectedItem() != null ) if( mMapIconCombo.getSelectedItem() != null )
{ {
mAlias.setIconName( ((MapIcon)mMapIconCombo.getSelectedItem()).getName() ); alias.setIconName( ((MapIcon)mMapIconCombo.getSelectedItem()).getName() );
} }
//Broadcast an alias change event to save the updates
mAliasModel.broadcast( new AliasEvent( getItem(), Event.CHANGE ) );
} }
setModified( false );
} }
} }

View File

@@ -36,6 +36,7 @@ import alias.action.clip.ClipAction;
import alias.action.clip.ClipActionNode; import alias.action.clip.ClipActionNode;
import alias.action.script.ScriptAction; import alias.action.script.ScriptAction;
import alias.action.script.ScriptActionNode; import alias.action.script.ScriptActionNode;
import alias.id.AliasID;
import alias.id.esn.ESNNode; import alias.id.esn.ESNNode;
import alias.id.esn.Esn; import alias.id.esn.Esn;
import alias.id.fleetsync.FleetsyncID; import alias.id.fleetsync.FleetsyncID;

View File

@@ -18,7 +18,6 @@
package alias; package alias;
import javax.swing.JPanel; import javax.swing.JPanel;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener; import javax.swing.event.DocumentListener;
public abstract class ComponentEditor<T> extends JPanel implements DocumentListener public abstract class ComponentEditor<T> extends JPanel implements DocumentListener
@@ -71,21 +70,6 @@ public abstract class ComponentEditor<T> extends JPanel implements DocumentListe
return mModified; return mModified;
} }
@Override
public void insertUpdate( DocumentEvent e )
{
setModified( true );
}
@Override
public void removeUpdate( DocumentEvent e )
{
setModified( true );
}
@Override
public void changedUpdate( DocumentEvent e ) { }
public void setComponentModificationListener( ComponentModificationListener listener ) public void setComponentModificationListener( ComponentModificationListener listener )
{ {
mListener = listener; mListener = listener;

View File

@@ -1,32 +0,0 @@
package alias;
import javax.swing.JLabel;
import net.miginfocom.swing.MigLayout;
import alias.action.AliasAction;
public class EmptyAliasActionEditor extends ComponentEditor<AliasAction>
{
private static final long serialVersionUID = 1L;
public EmptyAliasActionEditor()
{
setLayout( new MigLayout( "", "[center]", "[][grow]" ) );
add( new JLabel( "Please select an alias action" ), "wrap" );
}
@Override
public void setComponent( AliasAction t )
{
}
@Override
public void save()
{
}
@Override
public void reset()
{
}
}

View File

@@ -1,31 +0,0 @@
package alias;
import javax.swing.JLabel;
import net.miginfocom.swing.MigLayout;
public class EmptyAliasIDEditor extends ComponentEditor<AliasID>
{
private static final long serialVersionUID = 1L;
public EmptyAliasIDEditor()
{
setLayout( new MigLayout( "", "[center]", "[][grow]" ) );
add( new JLabel( "Please select an identifier" ), "wrap" );
}
@Override
public void setComponent( AliasID t )
{
}
@Override
public void save()
{
}
@Override
public void reset()
{
}
}

View File

@@ -19,6 +19,7 @@ package alias.action;
import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlSeeAlso; import javax.xml.bind.annotation.XmlSeeAlso;
import javax.xml.bind.annotation.XmlTransient;
import message.Message; import message.Message;
import alias.Alias; import alias.Alias;
@@ -37,6 +38,9 @@ public abstract class AliasAction
public AliasAction() public AliasAction()
{ {
} }
@XmlTransient
public abstract AliasActionType getType();
/** /**
* Task to execute when an alias action is defined. The message argument is * Task to execute when an alias action is defined. The message argument is

View File

@@ -0,0 +1,349 @@
/*******************************************************************************
* SDR Trunk
* Copyright (C) 2014-2016 Dennis Sheirer
*
* 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 3 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, see <http://www.gnu.org/licenses/>
******************************************************************************/
package alias.action;
import gui.editor.Editor;
import gui.editor.EmptyEditor;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JList;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.ListModel;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import net.miginfocom.swing.MigLayout;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import alias.Alias;
import alias.AliasEvent;
import alias.AliasEvent.Event;
import alias.AliasFactory;
import alias.AliasModel;
public class AliasActionEditor extends Editor<Alias>
{
private static final long serialVersionUID = 1L;
private final static Logger mLog = LoggerFactory.getLogger( AliasActionEditor.class );
private static ListModel<AliasAction> EMPTY_MODEL = new DefaultListModel<>();
private JList<AliasAction> mAliasActionList = new JList<>( EMPTY_MODEL );
private JButton mNewActionButton;
private JButton mCloneActionButton;
private JButton mDeleteActionButton;
private EditorContainer mEditorContainer = new EditorContainer();
private AliasModel mAliasModel;
public AliasActionEditor( AliasModel model )
{
mAliasModel = model;
init();
}
private void init()
{
setLayout( new MigLayout( "fill,wrap 3",
"[grow,fill][grow,fill][grow,fill]", "[][grow,fill][]" ) );
mAliasActionList.setVisibleRowCount( 6 );
mAliasActionList.setSelectionMode( ListSelectionModel.SINGLE_SELECTION );
mAliasActionList.setLayoutOrientation( JList.VERTICAL );
mAliasActionList.addListSelectionListener( new ListSelectionListener()
{
@Override
public void valueChanged( ListSelectionEvent event )
{
if( !event.getValueIsAdjusting() )
{
JList<?> list = (JList<?>)event.getSource();
Object selectedItem = list.getSelectedValue();
if( selectedItem != null && selectedItem instanceof AliasAction )
{
AliasAction selected = (AliasAction)selectedItem;
mEditorContainer.setAliasAction( selected );
mCloneActionButton.setEnabled( true );
mDeleteActionButton.setEnabled( true );
}
else
{
mCloneActionButton.setEnabled( false );
mDeleteActionButton.setEnabled( false );
}
}
}
} );
JScrollPane scroller = new JScrollPane( mAliasActionList );
add( scroller, "span,grow" );
add( mEditorContainer, "span,grow" );
mNewActionButton = new JButton( "New ..." );
mNewActionButton.setToolTipText( "Create a new Alias Action" );
mNewActionButton.addMouseListener( new MouseAdapter()
{
@Override
public void mouseClicked( MouseEvent e )
{
JPopupMenu menu = new JPopupMenu();
menu.add( new AddAliasActionItem( AliasActionType.BEEP ) );
menu.add( new AddAliasActionItem( AliasActionType.CLIP ) );
menu.add( new AddAliasActionItem( AliasActionType.SCRIPT ) );
menu.show( e.getComponent(), e.getX(), e.getY() );
}
} );
add( mNewActionButton );
mCloneActionButton = new JButton( "Clone" );
mCloneActionButton.setToolTipText( "Create a copy of the currently selected action" );
mCloneActionButton.setEnabled( false );
mCloneActionButton.addActionListener( new ActionListener()
{
@Override
public void actionPerformed( ActionEvent e )
{
AliasAction selected = mAliasActionList.getSelectedValue();
if( selected != null )
{
AliasAction clone = AliasFactory.copyOf( selected );
if( clone != null )
{
addAliasActionToList( clone );
}
}
}
} );
add( mCloneActionButton );
mDeleteActionButton = new JButton( "Delete" );
mDeleteActionButton.setToolTipText( "Delete the currently selected action" );
mDeleteActionButton.setEnabled( false );
mDeleteActionButton.addActionListener( new ActionListener()
{
@Override
public void actionPerformed( ActionEvent e )
{
final AliasAction selected = mAliasActionList.getSelectedValue();
if( selected != null )
{
int choice = JOptionPane.showConfirmDialog( mDeleteActionButton,
"Do you want to delete [" + selected.toString() + "]",
"Are you sure?", JOptionPane.YES_NO_OPTION );
if( choice == JOptionPane.YES_OPTION && hasItem() )
{
Alias alias = getItem();
alias.removeAliasAction( selected );
mAliasModel.broadcast( new AliasEvent( alias, Event.CHANGE ) );
setItem( alias );
}
}
}
} );
add( mDeleteActionButton, "wrap" );
}
@Override
public void setItem( Alias alias )
{
super.setItem( alias );
if( alias == null || alias.getAction().isEmpty() )
{
mAliasActionList.setModel( EMPTY_MODEL );
}
else
{
DefaultListModel<AliasAction> model = new DefaultListModel<>();
List<AliasAction> actions = alias.getAction();
Collections.sort( actions, new Comparator<AliasAction>()
{
@Override
public int compare( AliasAction o1, AliasAction o2 )
{
return o1.toString().compareTo( o2.toString() );
}
} );
for( AliasAction action: actions )
{
model.addElement( action );
}
mAliasActionList.setModel( model );
}
mEditorContainer.setAliasAction( null );
}
@Override
public void save()
{
if( mEditorContainer.isModified() )
{
mEditorContainer.save();
if( hasItem() )
{
mAliasModel.broadcast( new AliasEvent( getItem(), Event.CHANGE ) );
}
}
}
public class EditorContainer extends JPanel
{
private static final long serialVersionUID = 1L;
private Editor<AliasAction> mEditor = new EmptyEditor<>();
public EditorContainer()
{
setLayout( new MigLayout( "","[grow,fill]", "[grow,fill]" ) );
add( mEditor );
}
public boolean isModified()
{
if( mEditor != null )
{
return mEditor.isModified();
}
return false;
}
public void save()
{
if( mEditor != null )
{
mEditor.save();
}
}
public void setAliasAction( AliasAction aliasAction )
{
if( mEditor != null )
{
if( mEditor.isModified() )
{
int option = JOptionPane.showConfirmDialog(
EditorContainer.this,
"Action settings have changed. Do you want to save these changes?",
"Save Changes?",
JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE );
if( option == JOptionPane.YES_OPTION )
{
mEditor.save();
}
}
}
removeAll();
//This will always give us an editor
mEditor = AliasFactory.getEditor( aliasAction );
add( mEditor );
revalidate();
}
}
private void addAliasActionToList( final AliasAction action )
{
if( action != null && hasItem() )
{
final Alias alias = getItem();
alias.addAliasAction( action );
EventQueue.invokeLater( new Runnable()
{
@Override
public void run()
{
setItem( alias );
mAliasActionList.setSelectedValue( action, true );
}
} );
}
}
public class AddAliasActionItem extends JMenuItem
{
private static final long serialVersionUID = 1L;
private AliasActionType mAliasActionType;
public AddAliasActionItem( AliasActionType type )
{
super( type.toString() );
mAliasActionType = type;
addActionListener( new ActionListener()
{
@Override
public void actionPerformed( ActionEvent e )
{
final AliasAction action =
AliasFactory.getAliasAction( mAliasActionType );
addAliasActionToList( action );
}
} );
}
}
}

View File

@@ -15,7 +15,9 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/> * along with this program. If not, see <http://www.gnu.org/licenses/>
******************************************************************************/ ******************************************************************************/
package alias; package alias.action;
import alias.AliasEvent;
/** /**
* Interface for receiving alias events. Each listener will receive * Interface for receiving alias events. Each listener will receive

View File

@@ -1,5 +1,4 @@
/******************************************************************************* /*******************************************************************************
* SDR Trunk * SDR Trunk
* Copyright (C) 2014-2016 Dennis Sheirer * Copyright (C) 2014-2016 Dennis Sheirer
* *
@@ -16,21 +15,23 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/> * along with this program. If not, see <http://www.gnu.org/licenses/>
******************************************************************************/ ******************************************************************************/
package alias; package alias.action;
import javax.swing.JPanel; public enum AliasActionType
public abstract class AliasConfigurationEditor extends JPanel
{ {
private static final long serialVersionUID = 1L; BEEP( "Beep" ),
CLIP( "Play Clip" ),
/** SCRIPT( "Run Script" );
* Sets or resets the configuration editor components
*/ private String mLabel;
public abstract void setAlias( Alias alias );
private AliasActionType( String label )
/** {
* Saves the contents of the editor components to the configuration mLabel = label;
*/ }
public abstract void save();
public String toString()
{
return mLabel;
}
} }

View File

@@ -2,13 +2,27 @@ package alias.action.beep;
import message.Message; import message.Message;
import alias.Alias; import alias.Alias;
import alias.action.AliasActionType;
import alias.action.RecurringAction; import alias.action.RecurringAction;
public class BeepAction extends RecurringAction public class BeepAction extends RecurringAction
{ {
@Override
public AliasActionType getType()
{
return AliasActionType.BEEP;
}
@Override @Override
public void performAction( Alias alias, Message message ) public void performAction( Alias alias, Message message )
{ {
System.out.println( "\007" ); System.out.println( "\007" );
} }
@Override
public String toString()
{
return "Beep";
}
} }

View File

@@ -1,6 +1,6 @@
/******************************************************************************* /*******************************************************************************
* SDR Trunk * SDR Trunk
* Copyright (C) 2014 Dennis Sheirer * Copyright (C) 2014-2016 Dennis Sheirer
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@@ -17,59 +17,77 @@
******************************************************************************/ ******************************************************************************/
package alias.action.beep; package alias.action.beep;
import gui.editor.DocumentListenerEditor;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JButton;
import javax.swing.JComboBox; import javax.swing.JComboBox;
import javax.swing.JLabel; import javax.swing.JLabel;
import javax.swing.JPanel; import javax.swing.JOptionPane;
import javax.swing.JSlider;
import javax.swing.JSpinner; import javax.swing.JSpinner;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SpinnerModel; import javax.swing.SpinnerModel;
import javax.swing.SpinnerNumberModel; import javax.swing.SpinnerNumberModel;
import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener; import javax.swing.event.ChangeListener;
import net.miginfocom.swing.MigLayout; import net.miginfocom.swing.MigLayout;
import alias.action.AliasAction;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import alias.action.RecurringAction.Interval; import alias.action.RecurringAction.Interval;
import alias.id.priority.Priority;
public class BeepActionEditor extends JPanel implements ActionListener public class BeepActionEditor extends DocumentListenerEditor<AliasAction>
{ {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private final static Logger mLog = private static final String HELP_TEXT =
LoggerFactory.getLogger( BeepActionEditor.class ); "<html><h3>Beep Action</h3>"
+ "This action will sound a beep according to the interval<br>"
private BeepActionNode mBeepActionNode; + "that you select:<br><br>"
private JTextField mTextSiteID; + "<b>Once:</b> Beep the first time the alias is active and<br>"
private JComboBox<Interval> mComboInterval; + "never again<br><br>"
private JSpinner mSpinnerPeriod; + "<b>Once, Reset After Delay:</b> Beep once and suppress<br>"
+ "subsequent beeps for the specified period in seconds.<br>"
+ "After the reset period, beep again when the alias is active.<br><br>"
+ "<b>Until Dismissed:</b> Beep every period seconds until you<br>"
+ "click OK on the dialog that appears. Alerting is suppressed<br>"
+ "for 15 seconds after you click OK.<br>"
+ "</html>";
public BeepActionEditor( BeepActionNode beepActionNode ) private JComboBox<Interval> mComboInterval;
private JSlider mPeriodSlider;
private JLabel mPeriodSliderLabel;
public BeepActionEditor( AliasAction aliasAction )
{ {
mBeepActionNode = beepActionNode; init();
initGUI(); setItem( aliasAction );
} }
private void initGUI() public BeepAction getBeepAction()
{ {
setLayout( new MigLayout( "fill,wrap 2", "[right][left]", "[][][][][][grow]" ) ); if( getItem() instanceof BeepAction )
{
add( new JLabel( "Action: Beep" ), "span,align center" ); return (BeepAction)getItem();
}
add( new JLabel( "Interval:" ) ); return null;
}
private void init()
{
setLayout( new MigLayout( "fill,wrap 2", "[right][left]", "[][][]" ) );
add( new JLabel( "Beep Interval:" ) );
mComboInterval = new JComboBox<Interval>( Interval.values() ); mComboInterval = new JComboBox<Interval>( Interval.values() );
mComboInterval.setToolTipText( HELP_TEXT );
mComboInterval.setSelectedItem( mBeepActionNode.getBeepAction().getInterval() );
mComboInterval.addActionListener( new ActionListener() mComboInterval.addActionListener( new ActionListener()
{ {
@Override @Override
@@ -81,71 +99,97 @@ public class BeepActionEditor extends JPanel implements ActionListener
if( selected != null ) if( selected != null )
{ {
/* Enable/disable period spinner based on selection */ /* Enable/disable period spinner based on selection */
mSpinnerPeriod.setEnabled( selected != Interval.ONCE ); boolean enabled = selected != Interval.ONCE;
mBeepActionNode.getBeepAction().setInterval( selected ); mPeriodSlider.setEnabled( enabled );
mPeriodSliderLabel.setEnabled( enabled );
} }
setModified( true );
} }
}); });
add( mComboInterval, "wrap" ); add( mComboInterval, "wrap" );
final SpinnerModel model = new SpinnerNumberModel( final SpinnerModel model = new SpinnerNumberModel( 1, 1, 30, 1 );
mBeepActionNode.getBeepAction().getPeriod(), 1, 30, 1 );
model.addChangeListener( new ChangeListener() model.addChangeListener( new ChangeListener()
{ {
@Override @Override
public void stateChanged( ChangeEvent e ) public void stateChanged( ChangeEvent e )
{ {
mBeepActionNode.getBeepAction().setPeriod( (int)model.getValue() ); setModified( true );
} }
} ); } );
mSpinnerPeriod = new JSpinner( model ); mPeriodSlider = new JSlider( JSlider.HORIZONTAL, 1, 60, 1 );
mPeriodSlider.setMajorTickSpacing( 10 );
if( mBeepActionNode.getBeepAction().getInterval() == Interval.ONCE ) mPeriodSlider.setMinorTickSpacing( 2 );
mPeriodSlider.setPaintTicks( true );
mPeriodSlider.setLabelTable( mPeriodSlider.createStandardLabels( 10, 10 ) );
mPeriodSlider.setPaintLabels( true );
mPeriodSlider.addChangeListener( new ChangeListener()
{ {
mSpinnerPeriod.setEnabled( false ); @Override
public void stateChanged( ChangeEvent e )
{
mPeriodSliderLabel.setText( "Period: " + mPeriodSlider.getValue() );
setModified( true );
}
} );
mPeriodSlider.setToolTipText( HELP_TEXT );
mPeriodSliderLabel = new JLabel( "Period: " + mPeriodSlider.getValue() + " " );
add( mPeriodSliderLabel );
add( mPeriodSlider, "wrap,grow" );
JLabel example = new JLabel( "Help ..." );
example.setForeground( Color.BLUE.brighter() );
example.setCursor( new Cursor( Cursor.HAND_CURSOR ) );
example.addMouseListener( new MouseAdapter()
{
@Override
public void mouseClicked( MouseEvent e )
{
JOptionPane.showMessageDialog( BeepActionEditor.this,
HELP_TEXT, "Help", JOptionPane.INFORMATION_MESSAGE );
}
} );
add( example );
}
@Override
public void setItem( AliasAction item )
{
super.setItem( item );
if( hasItem() )
{
BeepAction beep = getBeepAction();
Interval interval = beep.getInterval();
mComboInterval.setSelectedItem( interval );
boolean enabled = interval != Interval.ONCE;
mPeriodSliderLabel.setEnabled( enabled );
mPeriodSlider.setEnabled( enabled );
mPeriodSlider.setValue( beep.getPeriod() );
} }
add( new JLabel( "Period:" ) ); setModified( false );
add( mSpinnerPeriod, "wrap" );
StringBuilder sb = new StringBuilder();
sb.append( "This action will sound a beep according to the interval that you select.\n\n" );
sb.append( "Once - Beep the first time the alias is active and never again.\n\n" );
sb.append( "Once, Reset After Delay - Beep once and suppress subsequent beeps for the specified period in seconds. After the reset period, it will beep again when the alias is active.\n\n" );
sb.append( "Until Dismissed - Beep every period seconds until you click OK on the dialog that appears. Alerting is suppressed for 15 seconds after you click OK." );
JTextArea description = new JTextArea( sb.toString() );
description.setLineWrap( true );
description.setBackground( getBackground() );
add( description, "growx,span" );
JButton btnSave = new JButton( "Save" );
btnSave.addActionListener( BeepActionEditor.this );
add( btnSave, "growx,push" );
JButton btnReset = new JButton( "Reset" );
btnReset.addActionListener( BeepActionEditor.this );
add( btnReset, "growx,push" );
} }
@Override @Override
public void actionPerformed( ActionEvent e ) public void save()
{ {
String command = e.getActionCommand(); if( hasItem() && isModified() )
if( command.contentEquals( "Save" ) )
{ {
mBeepActionNode.save(); BeepAction beep = getBeepAction();
mBeepActionNode.show();
beep.setInterval( (Interval)mComboInterval.getSelectedItem() );
beep.setPeriod( mPeriodSlider.getValue() );
} }
mBeepActionNode.refresh(); setModified( false );
} }
} }

View File

@@ -41,7 +41,7 @@ public class BeepActionNode extends AliasActionNode
@Override @Override
public JPanel getEditor() public JPanel getEditor()
{ {
return new BeepActionEditor( this ); return null;
} }
public BeepAction getBeepAction() public BeepAction getBeepAction()

View File

@@ -13,6 +13,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import alias.Alias; import alias.Alias;
import alias.action.AliasActionType;
import alias.action.RecurringAction; import alias.action.RecurringAction;
public class ClipAction extends RecurringAction public class ClipAction extends RecurringAction
@@ -28,9 +29,14 @@ public class ClipAction extends RecurringAction
{ {
} }
@Override
public AliasActionType getType()
{
return AliasActionType.CLIP;
}
public String getPath() public String getPath()
{ {
return mFilePath; return mFilePath;
} }
@@ -87,4 +93,18 @@ public class ClipAction extends RecurringAction
throw e; throw e;
} }
} }
@Override
public String toString()
{
if( mFilePath == null )
{
return "Play Clip";
}
else
{
return "Play Clip: " + mFilePath;
}
}
} }

View File

@@ -1,6 +1,6 @@
/******************************************************************************* /*******************************************************************************
* SDR Trunk * SDR Trunk
* Copyright (C) 2014 Dennis Sheirer * Copyright (C) 2014-2016 Dennis Sheirer
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@@ -17,9 +17,15 @@
******************************************************************************/ ******************************************************************************/
package alias.action.clip; package alias.action.clip;
import gui.editor.DocumentListenerEditor;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.EventQueue; import java.awt.EventQueue;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File; import java.io.File;
import javax.swing.JButton; import javax.swing.JButton;
@@ -27,9 +33,7 @@ import javax.swing.JComboBox;
import javax.swing.JFileChooser; import javax.swing.JFileChooser;
import javax.swing.JLabel; import javax.swing.JLabel;
import javax.swing.JOptionPane; import javax.swing.JOptionPane;
import javax.swing.JPanel; import javax.swing.JSlider;
import javax.swing.JSpinner;
import javax.swing.JTextArea;
import javax.swing.JTextField; import javax.swing.JTextField;
import javax.swing.SpinnerModel; import javax.swing.SpinnerModel;
import javax.swing.SpinnerNumberModel; import javax.swing.SpinnerNumberModel;
@@ -37,43 +41,59 @@ import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener; import javax.swing.event.ChangeListener;
import net.miginfocom.swing.MigLayout; import net.miginfocom.swing.MigLayout;
import alias.action.AliasAction;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import alias.action.RecurringAction.Interval; import alias.action.RecurringAction.Interval;
import alias.action.script.ScriptActionEditor;
public class ClipActionEditor extends JPanel implements ActionListener public class ClipActionEditor extends DocumentListenerEditor<AliasAction>
{ {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private final static Logger mLog = private static final String PLEASE_SELECT_A_FILE = "Please select a file";
LoggerFactory.getLogger( ClipActionEditor.class ); private static final String HELP_TEXT =
"<html><h3>Clip Action</h3>"
private ClipActionNode mClipActionNode; + "This action will play an audio clip according to the interval<br>"
+ "that you select:<br><br>"
+ "<b>Once:</b> play the first time the alias is active and<br>"
+ "never again<br><br>"
+ "<b>Once, Reset After Delay:</b> play once and suppress<br>"
+ "subsequent runs for the specified period in seconds.<br>"
+ "After the reset period, play again when the alias is active.<br><br>"
+ "<b>Until Dismissed:</b> play every period seconds until you<br>"
+ "click OK on the dialog that appears. Alerting is suppressed<br>"
+ "for 15 seconds after you click OK.<br>"
+ "</html>";
private JComboBox<Interval> mComboInterval; private JComboBox<Interval> mComboInterval;
private JSpinner mSpinnerPeriod; private JSlider mPeriodSlider;
private JLabel mPeriodSliderLabel;
private JTextField mTextFilePath; private JTextField mTextFilePath;
public ClipActionEditor( ClipActionNode clipActionNode ) public ClipActionEditor( AliasAction aliasAction )
{ {
mClipActionNode = clipActionNode; init();
initGUI(); setItem( aliasAction );
} }
private void initGUI() public ClipAction getClipAction()
{ {
setLayout( new MigLayout( "fill,wrap 2", "[right][left]", "[][][][][][grow]" ) ); if( getItem() instanceof ClipAction )
{
add( new JLabel( "Action: Audio Clip" ), "span,align center" ); return (ClipAction)getItem();
}
add( new JLabel( "Interval:" ) ); return null;
}
private void init()
{
setLayout( new MigLayout( "fill,wrap 2", "[right][left]", "[][][][][]" ) );
add( new JLabel( "Play Interval:" ) );
mComboInterval = new JComboBox<Interval>( Interval.values() ); mComboInterval = new JComboBox<Interval>( Interval.values() );
mComboInterval.setToolTipText( HELP_TEXT );
mComboInterval.setSelectedItem( mClipActionNode.getClipAction().getInterval() );
mComboInterval.addActionListener( new ActionListener() mComboInterval.addActionListener( new ActionListener()
{ {
@Override @Override
@@ -84,37 +104,51 @@ public class ClipActionEditor extends JPanel implements ActionListener
if( selected != null ) if( selected != null )
{ {
/* Enable/disable period spinner based on selection */ /* Enable/disable period slider based on selection */
mSpinnerPeriod.setEnabled( selected != Interval.ONCE ); boolean enabled = selected != Interval.ONCE;
mClipActionNode.getClipAction().setInterval( selected ); mPeriodSlider.setEnabled( enabled );
mPeriodSliderLabel.setEnabled( enabled );
} }
setModified( true );
} }
}); });
add( mComboInterval );
add( mComboInterval, "wrap" );
final SpinnerModel model = new SpinnerNumberModel( final SpinnerModel model = new SpinnerNumberModel( 1, 1, 30, 1 );
mClipActionNode.getClipAction().getPeriod(), 1, 30, 1 );
model.addChangeListener( new ChangeListener() model.addChangeListener( new ChangeListener()
{ {
@Override @Override
public void stateChanged( ChangeEvent e ) public void stateChanged( ChangeEvent e )
{ {
mClipActionNode.getClipAction().setPeriod( (int)model.getValue() ); setModified( true );
} }
} ); } );
mSpinnerPeriod = new JSpinner( model ); mPeriodSlider = new JSlider( JSlider.HORIZONTAL, 1, 60, 1 );
mPeriodSlider.setMajorTickSpacing( 10 );
if( mClipActionNode.getClipAction().getInterval() == Interval.ONCE ) mPeriodSlider.setMinorTickSpacing( 2 );
mPeriodSlider.setPaintTicks( true );
mPeriodSlider.setLabelTable( mPeriodSlider.createStandardLabels( 10, 10 ) );
mPeriodSlider.setPaintLabels( true );
mPeriodSlider.addChangeListener( new ChangeListener()
{ {
mSpinnerPeriod.setEnabled( false ); @Override
} public void stateChanged( ChangeEvent e )
{
mPeriodSliderLabel.setText( "Period: " + mPeriodSlider.getValue() );
setModified( true );
}
} );
mPeriodSlider.setToolTipText( HELP_TEXT );
add( new JLabel( "Period:" ) ); mPeriodSliderLabel = new JLabel( "Period: " + mPeriodSlider.getValue() + " " );
add( mSpinnerPeriod, "wrap" ); add( mPeriodSliderLabel );
add( mPeriodSlider, "wrap,grow" );
mTextFilePath = new JTextField( PLEASE_SELECT_A_FILE );
add( mTextFilePath, "growx,span" );
JButton fileButton = new JButton( "File" ); JButton fileButton = new JButton( "File" );
@@ -131,88 +165,134 @@ public class ClipActionEditor extends JPanel implements ActionListener
{ {
File file = chooser.getSelectedFile(); File file = chooser.getSelectedFile();
mClipActionNode.getClipAction().setPath( file.getAbsolutePath() );
mTextFilePath.setText( file.getAbsolutePath() ); mTextFilePath.setText( file.getAbsolutePath() );
setModified( true );
} }
} }
} ); } );
add( fileButton ); add( fileButton, "grow" );
JButton testButton = new JButton( "Test" ); JButton testButton = new JButton( "Test" );
testButton.addActionListener( new ActionListener()
testButton.addActionListener( new ActionListener()
{ {
@Override @Override
public void actionPerformed( ActionEvent actionEvent ) public void actionPerformed( ActionEvent e )
{ {
String path = mClipActionNode.getClipAction().getPath(); if( hasItem() )
if( path == null || path.trim().isEmpty() )
{ {
JOptionPane.showMessageDialog( ClipActionEditor.this, String path = mTextFilePath.getText();
"Please select an audio file", "Please select file",
JOptionPane.ERROR_MESSAGE ); if( path == null || path.trim().isEmpty() )
}
EventQueue.invokeLater( new Runnable()
{
@Override
public void run()
{ {
try JOptionPane.showMessageDialog( ClipActionEditor.this,
{ "Please select an audio file", PLEASE_SELECT_A_FILE,
mClipActionNode.getClipAction().play(); JOptionPane.ERROR_MESSAGE );
}
catch( Exception e )
{
JOptionPane.showMessageDialog( ClipActionEditor.this,
"Couldn't play audio clip [" + e.getMessage() + "]",
"Error", JOptionPane.ERROR_MESSAGE );
}
} }
} ); else
{
if( isModified() )
{
int option = JOptionPane.showConfirmDialog(
ClipActionEditor.this,
"Settings have changed. Do you want to save these changes?",
"Save Changes?",
JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE );
if( option == JOptionPane.YES_OPTION )
{
save();
}
}
new Thread( new Runnable()
{
@Override
public void run()
{
try
{
getClipAction().play();
}
catch( Exception e1 )
{
JOptionPane.showMessageDialog( ClipActionEditor.this,
"Couldn't play audio clip [" + e1.getMessage() + "]",
"Error", JOptionPane.ERROR_MESSAGE );
}
}
}).start();
}
}
} }
} ); } );
add( testButton, "wrap" );
mTextFilePath = new JTextField( mClipActionNode.getClipAction().getPath() );
add( mTextFilePath, "growx,span" );
StringBuilder sb = new StringBuilder(); add( testButton, "grow,wrap" );
sb.append( "This action will play the audio clip according to the interval that you select.\n\n" ); JLabel example = new JLabel( "Help ..." );
sb.append( "Once - Play the first time the alias is active and never again.\n\n" ); example.setForeground( Color.BLUE.brighter() );
sb.append( "Once, Reset After Delay - Play once and suppress subsequent plays for the specified period in seconds. After the reset period, it will play again when the alias is active.\n\n" ); example.setCursor( new Cursor( Cursor.HAND_CURSOR ) );
sb.append( "Until Dismissed - Play audio clip every period seconds until you click OK on the dialog that appears. Alerting is suppressed for 15 seconds after you click OK." ); example.addMouseListener( new MouseAdapter()
{
@Override
public void mouseClicked( MouseEvent e )
{
JOptionPane.showMessageDialog( ClipActionEditor.this,
HELP_TEXT, "Help", JOptionPane.INFORMATION_MESSAGE );
}
} );
add( example );
}
@Override
public void setItem( AliasAction item )
{
super.setItem( item );
JTextArea description = new JTextArea( sb.toString() ); if( hasItem() )
{
description.setLineWrap( true ); ClipAction clip = getClipAction();
description.setBackground( getBackground() );
add( description, "growx,span" );
JButton btnSave = new JButton( "Save" );
btnSave.addActionListener( ClipActionEditor.this );
add( btnSave, "growx,push" );
JButton btnReset = new JButton( "Reset" ); Interval interval = clip.getInterval();
btnReset.addActionListener( ClipActionEditor.this );
add( btnReset, "growx,push" ); mComboInterval.setSelectedItem( interval );
boolean enabled = interval != Interval.ONCE;
mPeriodSliderLabel.setEnabled( enabled );
mPeriodSlider.setEnabled( enabled );
mPeriodSlider.setValue( clip.getPeriod() );
String filepath = clip.getPath();
if( filepath != null && !filepath.isEmpty() )
{
mTextFilePath.setText( filepath );
}
else
{
mTextFilePath.setText( PLEASE_SELECT_A_FILE );
}
}
setModified( false );
} }
@Override @Override
public void actionPerformed( ActionEvent e ) public void save()
{ {
String command = e.getActionCommand(); if( hasItem() && isModified() )
if( command.contentEquals( "Save" ) )
{ {
mClipActionNode.save(); ClipAction script = getClipAction();
mClipActionNode.show();
script.setInterval( (Interval)mComboInterval.getSelectedItem() );
script.setPeriod( mPeriodSlider.getValue() );
script.setPath( mTextFilePath.getText() );
} }
mClipActionNode.refresh(); setModified( false );
} }
} }

View File

@@ -41,7 +41,7 @@ public class ClipActionNode extends AliasActionNode
@Override @Override
public JPanel getEditor() public JPanel getEditor()
{ {
return new ClipActionEditor( this ); return null;
} }
public ClipAction getClipAction() public ClipAction getClipAction()

View File

@@ -9,6 +9,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import alias.Alias; import alias.Alias;
import alias.action.AliasActionType;
import alias.action.RecurringAction; import alias.action.RecurringAction;
public class ScriptAction extends RecurringAction public class ScriptAction extends RecurringAction
@@ -21,6 +22,12 @@ public class ScriptAction extends RecurringAction
{ {
} }
@Override
public AliasActionType getType()
{
return AliasActionType.SCRIPT;
}
public String getScript() public String getScript()
{ {
return mScript; return mScript;
@@ -75,4 +82,17 @@ public class ScriptAction extends RecurringAction
} }
} }
} }
@Override
public String toString()
{
if( mScript == null )
{
return "Run Script";
}
else
{
return "Run Script: " + mScript;
}
}
} }

View File

@@ -1,6 +1,6 @@
/******************************************************************************* /*******************************************************************************
* SDR Trunk * SDR Trunk
* Copyright (C) 2014 Dennis Sheirer * Copyright (C) 2014-2016 Dennis Sheirer
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@@ -17,9 +17,16 @@
******************************************************************************/ ******************************************************************************/
package alias.action.script; package alias.action.script;
import gui.editor.DocumentListenerEditor;
import gui.editor.Editor;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.EventQueue; import java.awt.EventQueue;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File; import java.io.File;
import javax.swing.JButton; import javax.swing.JButton;
@@ -27,9 +34,7 @@ import javax.swing.JComboBox;
import javax.swing.JFileChooser; import javax.swing.JFileChooser;
import javax.swing.JLabel; import javax.swing.JLabel;
import javax.swing.JOptionPane; import javax.swing.JOptionPane;
import javax.swing.JPanel; import javax.swing.JSlider;
import javax.swing.JSpinner;
import javax.swing.JTextArea;
import javax.swing.JTextField; import javax.swing.JTextField;
import javax.swing.SpinnerModel; import javax.swing.SpinnerModel;
import javax.swing.SpinnerNumberModel; import javax.swing.SpinnerNumberModel;
@@ -37,43 +42,59 @@ import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener; import javax.swing.event.ChangeListener;
import net.miginfocom.swing.MigLayout; import net.miginfocom.swing.MigLayout;
import alias.action.AliasAction;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import alias.action.RecurringAction.Interval; import alias.action.RecurringAction.Interval;
import alias.action.clip.ClipActionEditor;
public class ScriptActionEditor extends JPanel implements ActionListener public class ScriptActionEditor extends DocumentListenerEditor<AliasAction>
{ {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private final static Logger mLog = private static final String PLEASE_SELECT_A_FILE = "Please select a file";
LoggerFactory.getLogger( ScriptActionEditor.class ); private static final String HELP_TEXT =
"<html><h3>Script Action</h3>"
private ScriptActionNode mScriptActionNode; + "This action will run a script according to the interval<br>"
+ "that you select:<br><br>"
+ "<b>Once:</b> run the first time the alias is active and<br>"
+ "never again<br><br>"
+ "<b>Once, Reset After Delay:</b> run once and suppress<br>"
+ "subsequent runs for the specified period in seconds.<br>"
+ "After the reset period, run again when the alias is active.<br><br>"
+ "<b>Until Dismissed:</b> run every period seconds until you<br>"
+ "click OK on the dialog that appears. Alerting is suppressed<br>"
+ "for 15 seconds after you click OK.<br>"
+ "</html>";
private JComboBox<Interval> mComboInterval; private JComboBox<Interval> mComboInterval;
private JSpinner mSpinnerPeriod; private JSlider mPeriodSlider;
private JLabel mPeriodSliderLabel;
private JTextField mTextFilePath; private JTextField mTextFilePath;
public ScriptActionEditor( ScriptActionNode clipActionNode ) public ScriptActionEditor( AliasAction aliasAction )
{ {
mScriptActionNode = clipActionNode; init();
initGUI(); setItem( aliasAction );
} }
private void initGUI() public ScriptAction getScriptAction()
{ {
setLayout( new MigLayout( "fill,wrap 2", "[right][left]", "[][][][][][grow]" ) ); if( getItem() instanceof ScriptAction )
{
add( new JLabel( "Action: Script" ), "span,align center" ); return (ScriptAction)getItem();
}
add( new JLabel( "Interval:" ) ); return null;
}
private void init()
{
setLayout( new MigLayout( "fill,wrap 2", "[right][left]", "[][][][][]" ) );
add( new JLabel( "Run Interval:" ) );
mComboInterval = new JComboBox<Interval>( Interval.values() ); mComboInterval = new JComboBox<Interval>( Interval.values() );
mComboInterval.setToolTipText( HELP_TEXT );
mComboInterval.setSelectedItem( mScriptActionNode.getScriptAction().getInterval() );
mComboInterval.addActionListener( new ActionListener() mComboInterval.addActionListener( new ActionListener()
{ {
@Override @Override
@@ -84,37 +105,51 @@ public class ScriptActionEditor extends JPanel implements ActionListener
if( selected != null ) if( selected != null )
{ {
/* Enable/disable period spinner based on selection */ /* Enable/disable period slider based on selection */
mSpinnerPeriod.setEnabled( selected != Interval.ONCE ); boolean enabled = selected != Interval.ONCE;
mScriptActionNode.getScriptAction().setInterval( selected ); mPeriodSlider.setEnabled( enabled );
mPeriodSliderLabel.setEnabled( enabled );
} }
setModified( true );
} }
}); });
add( mComboInterval );
add( mComboInterval, "wrap" );
final SpinnerModel model = new SpinnerNumberModel( final SpinnerModel model = new SpinnerNumberModel( 1, 1, 30, 1 );
mScriptActionNode.getScriptAction().getPeriod(), 1, 30, 1 );
model.addChangeListener( new ChangeListener() model.addChangeListener( new ChangeListener()
{ {
@Override @Override
public void stateChanged( ChangeEvent e ) public void stateChanged( ChangeEvent e )
{ {
mScriptActionNode.getScriptAction().setPeriod( (int)model.getValue() ); setModified( true );
} }
} ); } );
mSpinnerPeriod = new JSpinner( model ); mPeriodSlider = new JSlider( JSlider.HORIZONTAL, 1, 60, 1 );
mPeriodSlider.setMajorTickSpacing( 10 );
if( mScriptActionNode.getScriptAction().getInterval() == Interval.ONCE ) mPeriodSlider.setMinorTickSpacing( 2 );
mPeriodSlider.setPaintTicks( true );
mPeriodSlider.setLabelTable( mPeriodSlider.createStandardLabels( 10, 10 ) );
mPeriodSlider.setPaintLabels( true );
mPeriodSlider.addChangeListener( new ChangeListener()
{ {
mSpinnerPeriod.setEnabled( false ); @Override
} public void stateChanged( ChangeEvent e )
{
mPeriodSliderLabel.setText( "Period: " + mPeriodSlider.getValue() );
setModified( true );
}
} );
mPeriodSlider.setToolTipText( HELP_TEXT );
add( new JLabel( "Period:" ) ); mPeriodSliderLabel = new JLabel( "Period: " + mPeriodSlider.getValue() + " " );
add( mSpinnerPeriod, "wrap" ); add( mPeriodSliderLabel );
add( mPeriodSlider, "wrap,grow" );
mTextFilePath = new JTextField( PLEASE_SELECT_A_FILE );
add( mTextFilePath, "growx,span" );
JButton fileButton = new JButton( "File" ); JButton fileButton = new JButton( "File" );
@@ -131,13 +166,14 @@ public class ScriptActionEditor extends JPanel implements ActionListener
{ {
File file = chooser.getSelectedFile(); File file = chooser.getSelectedFile();
mScriptActionNode.getScriptAction().setScript( file.getAbsolutePath() );
mTextFilePath.setText( file.getAbsolutePath() ); mTextFilePath.setText( file.getAbsolutePath() );
setModified( true );
} }
} }
} ); } );
add( fileButton ); add( fileButton, "grow" );
JButton testButton = new JButton( "Test" ); JButton testButton = new JButton( "Test" );
testButton.addActionListener( new ActionListener() testButton.addActionListener( new ActionListener()
@@ -145,74 +181,115 @@ public class ScriptActionEditor extends JPanel implements ActionListener
@Override @Override
public void actionPerformed( ActionEvent actionEvent ) public void actionPerformed( ActionEvent actionEvent )
{ {
String script = mScriptActionNode.getScriptAction().getScript(); String script = mTextFilePath.getText();
if( script == null || script.trim().isEmpty() ) if( script == null || script.trim().isEmpty() )
{ {
JOptionPane.showMessageDialog( ScriptActionEditor.this, JOptionPane.showMessageDialog( ScriptActionEditor.this,
"Please select a script file", "Please select file", "Please select a script file", PLEASE_SELECT_A_FILE,
JOptionPane.ERROR_MESSAGE ); JOptionPane.ERROR_MESSAGE );
} }
else
EventQueue.invokeLater( new Runnable()
{ {
@Override if( isModified() )
public void run()
{ {
try int option = JOptionPane.showConfirmDialog(
ScriptActionEditor.this,
"Settings have changed. Do you want to save these changes?",
"Save Changes?",
JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE );
if( option == JOptionPane.YES_OPTION )
{ {
mScriptActionNode.getScriptAction().play(); save();
}
catch( Exception e )
{
JOptionPane.showMessageDialog( ScriptActionEditor.this,
"Couldn't run script [" + e.getMessage() + "]",
"Error", JOptionPane.ERROR_MESSAGE );
} }
} }
} );
new Thread( new Runnable()
{
@Override
public void run()
{
try
{
getScriptAction().play();
}
catch( Exception e1 )
{
JOptionPane.showMessageDialog( ScriptActionEditor.this,
e1.getMessage(), "Error", JOptionPane.ERROR_MESSAGE );
}
}
}).start();
}
} }
} ); } );
add( testButton, "wrap" ); add( testButton, "grow,wrap" );
mTextFilePath = new JTextField( mScriptActionNode.getScriptAction().getScript() ); JLabel example = new JLabel( "Help ..." );
add( mTextFilePath, "growx,span" ); example.setForeground( Color.BLUE.brighter() );
example.setCursor( new Cursor( Cursor.HAND_CURSOR ) );
example.addMouseListener( new MouseAdapter()
{
@Override
public void mouseClicked( MouseEvent e )
{
JOptionPane.showMessageDialog( ScriptActionEditor.this,
HELP_TEXT, "Help", JOptionPane.INFORMATION_MESSAGE );
}
} );
add( example );
}
@Override
public void setItem( AliasAction item )
{
super.setItem( item );
if( hasItem() )
{
ScriptAction script = getScriptAction();
StringBuilder sb = new StringBuilder(); Interval interval = script.getInterval();
sb.append( "This action will run the script according to the interval that you select.\n\n" ); mComboInterval.setSelectedItem( interval );
sb.append( "Once - Run script the first time the alias is active and never again.\n\n" );
sb.append( "Once, Reset After Delay - Run once and suppress subsequent runs for the specified period in seconds. After the reset period, it will play again when the alias is active.\n\n" );
sb.append( "Until Dismissed - Run script every period seconds until you click OK on the dialog that appears. Alerting is suppressed for 15 seconds after you click OK." );
JTextArea description = new JTextArea( sb.toString() );
description.setLineWrap( true );
description.setBackground( getBackground() );
add( description, "growx,span" );
JButton btnSave = new JButton( "Save" );
btnSave.addActionListener( ScriptActionEditor.this );
add( btnSave, "growx,push" );
JButton btnReset = new JButton( "Reset" ); boolean enabled = interval != Interval.ONCE;
btnReset.addActionListener( ScriptActionEditor.this );
add( btnReset, "growx,push" ); mPeriodSliderLabel.setEnabled( enabled );
mPeriodSlider.setEnabled( enabled );
mPeriodSlider.setValue( script.getPeriod() );
String filepath = script.getScript();
if( filepath != null && !filepath.isEmpty() )
{
mTextFilePath.setText( filepath );
}
else
{
mTextFilePath.setText( PLEASE_SELECT_A_FILE );
}
}
setModified( false );
} }
@Override @Override
public void actionPerformed( ActionEvent e ) public void save()
{ {
String command = e.getActionCommand(); if( hasItem() && isModified() )
if( command.contentEquals( "Save" ) )
{ {
mScriptActionNode.save(); ScriptAction script = getScriptAction();
mScriptActionNode.show();
script.setInterval( (Interval)mComboInterval.getSelectedItem() );
script.setPeriod( mPeriodSlider.getValue() );
script.setScript( mTextFilePath.getText() );
} }
mScriptActionNode.refresh(); setModified( false );
} }
} }

View File

@@ -41,7 +41,7 @@ public class ScriptActionNode extends AliasActionNode
@Override @Override
public JPanel getEditor() public JPanel getEditor()
{ {
return new ScriptActionEditor( this ); return null;
} }
public ScriptAction getScriptAction() public ScriptAction getScriptAction()

View File

@@ -15,11 +15,12 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/> * along with this program. If not, see <http://www.gnu.org/licenses/>
******************************************************************************/ ******************************************************************************/
package alias; package alias.id;
import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlSeeAlso; import javax.xml.bind.annotation.XmlSeeAlso;
import alias.Group;
import alias.id.esn.Esn; import alias.id.esn.Esn;
import alias.id.fleetsync.FleetsyncID; import alias.id.fleetsync.FleetsyncID;
import alias.id.lojack.LoJackFunctionAndID; import alias.id.lojack.LoJackFunctionAndID;

View File

@@ -15,7 +15,7 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/> * along with this program. If not, see <http://www.gnu.org/licenses/>
******************************************************************************/ ******************************************************************************/
package alias; package alias.id;
import playlist.PlaylistManager; import playlist.PlaylistManager;
import controller.ConfigurableNode; import controller.ConfigurableNode;

View File

@@ -1,6 +1,6 @@
/******************************************************************************* /*******************************************************************************
* SDR Trunk * SDR Trunk
* Copyright (C) 2014 Dennis Sheirer * Copyright (C) 2014-2016 Dennis Sheirer
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@@ -15,7 +15,7 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/> * along with this program. If not, see <http://www.gnu.org/licenses/>
******************************************************************************/ ******************************************************************************/
package alias; package alias.id;
public enum AliasIDType public enum AliasIDType
{ {
@@ -26,11 +26,14 @@ public enum AliasIDType
MDC1200( "MDC-1200" ), MDC1200( "MDC-1200" ),
MIN( "Passport MIN" ), MIN( "Passport MIN" ),
MPT1327( "MPT-1327" ), MPT1327( "MPT-1327" ),
NonRecordable( "Non-Recordable" ),
Priority( "Audio Priority" ),
Site( "Site" ), Site( "Site" ),
Status( "Status" ), Status( "Status" ),
Talkgroup( "Talkgroup" ); Talkgroup( "Talkgroup" ),
Invert( "Audio Inversion" ),
Priority( "Audio Priority" ),
NonRecordable( "Audio Non-Recordable" ),
Streaming( "Audio Streaming" );
private String mLabel; private String mLabel;

View File

@@ -1,4 +1,24 @@
package alias; /*******************************************************************************
* SDR Trunk
* Copyright (C) 2014-2016 Dennis Sheirer
*
* 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 3 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, see <http://www.gnu.org/licenses/>
******************************************************************************/
package alias.id;
import gui.editor.Editor;
import gui.editor.EmptyEditor;
import java.awt.EventQueue; import java.awt.EventQueue;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
@@ -27,9 +47,13 @@ import net.miginfocom.swing.MigLayout;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import alias.Alias;
import alias.AliasEvent;
import alias.AliasEvent.Event; import alias.AliasEvent.Event;
import alias.AliasFactory;
import alias.AliasModel;
public class AliasIdentifierEditor extends AliasConfigurationEditor public class AliasIdentifierEditor extends Editor<Alias>
{ {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@@ -40,10 +64,8 @@ public class AliasIdentifierEditor extends AliasConfigurationEditor
private JButton mNewIDButton; private JButton mNewIDButton;
private JButton mCloneIDButton; private JButton mCloneIDButton;
private JButton mDeleteIDButton; private JButton mDeleteIDButton;
private EditorContainer mEditorContainer = new EditorContainer(); private EditorContainer mEditorContainer = new EditorContainer();
private Alias mAlias;
private AliasModel mAliasModel; private AliasModel mAliasModel;
public AliasIdentifierEditor( AliasModel model ) public AliasIdentifierEditor( AliasModel model )
@@ -57,7 +79,7 @@ public class AliasIdentifierEditor extends AliasConfigurationEditor
setLayout( new MigLayout( "fill,wrap 3", setLayout( new MigLayout( "fill,wrap 3",
"[grow,fill][grow,fill][grow,fill]", "[][grow,fill][]" ) ); "[grow,fill][grow,fill][grow,fill]", "[][grow,fill][]" ) );
mAliasIDList.setVisibleRowCount( 4 ); mAliasIDList.setVisibleRowCount( 6 );
mAliasIDList.setSelectionMode( ListSelectionModel.SINGLE_SELECTION ); mAliasIDList.setSelectionMode( ListSelectionModel.SINGLE_SELECTION );
mAliasIDList.setLayoutOrientation( JList.VERTICAL ); mAliasIDList.setLayoutOrientation( JList.VERTICAL );
mAliasIDList.addListSelectionListener( new ListSelectionListener() mAliasIDList.addListSelectionListener( new ListSelectionListener()
@@ -95,7 +117,7 @@ public class AliasIdentifierEditor extends AliasConfigurationEditor
add( mEditorContainer, "span,grow" ); add( mEditorContainer, "span,grow" );
mNewIDButton = new JButton( "New ..." ); mNewIDButton = new JButton( "New ..." );
mNewIDButton.setToolTipText( "Create a new Alias Identifier" );
mNewIDButton.addMouseListener( new MouseAdapter() mNewIDButton.addMouseListener( new MouseAdapter()
{ {
@Override @Override
@@ -115,7 +137,6 @@ public class AliasIdentifierEditor extends AliasConfigurationEditor
menu.add( new AddAliasIdentifierItem( AliasIDType.Talkgroup ) ); menu.add( new AddAliasIdentifierItem( AliasIDType.Talkgroup ) );
menu.addSeparator(); menu.addSeparator();
menu.add( new AddAliasIdentifierItem( AliasIDType.Priority ) ); menu.add( new AddAliasIdentifierItem( AliasIDType.Priority ) );
menu.addSeparator();
menu.add( new AddAliasIdentifierItem( AliasIDType.NonRecordable ) ); menu.add( new AddAliasIdentifierItem( AliasIDType.NonRecordable ) );
menu.show( e.getComponent(), e.getX(), e.getY() ); menu.show( e.getComponent(), e.getX(), e.getY() );
@@ -125,6 +146,7 @@ public class AliasIdentifierEditor extends AliasConfigurationEditor
add( mNewIDButton ); add( mNewIDButton );
mCloneIDButton = new JButton( "Clone" ); mCloneIDButton = new JButton( "Clone" );
mCloneIDButton.setToolTipText( "Create a copy of the currently selected identifier" );
mCloneIDButton.setEnabled( false ); mCloneIDButton.setEnabled( false );
mCloneIDButton.addActionListener( new ActionListener() mCloneIDButton.addActionListener( new ActionListener()
{ {
@@ -147,6 +169,7 @@ public class AliasIdentifierEditor extends AliasConfigurationEditor
add( mCloneIDButton ); add( mCloneIDButton );
mDeleteIDButton = new JButton( "Delete" ); mDeleteIDButton = new JButton( "Delete" );
mDeleteIDButton.setToolTipText( "Delete the currently selected identifier" );
mDeleteIDButton.setEnabled( false ); mDeleteIDButton.setEnabled( false );
mDeleteIDButton.addActionListener( new ActionListener() mDeleteIDButton.addActionListener( new ActionListener()
{ {
@@ -161,13 +184,15 @@ public class AliasIdentifierEditor extends AliasConfigurationEditor
"Do you want to delete [" + selected.toString() + "]", "Do you want to delete [" + selected.toString() + "]",
"Are you sure?", JOptionPane.YES_NO_OPTION ); "Are you sure?", JOptionPane.YES_NO_OPTION );
if( choice == JOptionPane.YES_OPTION ) if( choice == JOptionPane.YES_OPTION && hasItem() )
{ {
mAlias.removeAliasID( selected ); Alias alias = getItem();
mAliasModel.broadcast( new AliasEvent( mAlias, Event.CHANGE ) ); alias.removeAliasID( selected );
mAliasModel.broadcast( new AliasEvent( alias, Event.CHANGE ) );
setAlias( mAlias ); setItem( alias );
} }
} }
} }
@@ -176,11 +201,11 @@ public class AliasIdentifierEditor extends AliasConfigurationEditor
} }
@Override @Override
public void setAlias( Alias alias ) public void setItem( Alias alias )
{ {
mAlias = alias; super.setItem( alias );
if( mAlias == null || mAlias.getId().isEmpty() ) if( alias == null || alias.getId().isEmpty() )
{ {
mAliasIDList.setModel( EMPTY_MODEL ); mAliasIDList.setModel( EMPTY_MODEL );
} }
@@ -188,7 +213,7 @@ public class AliasIdentifierEditor extends AliasConfigurationEditor
{ {
DefaultListModel<AliasID> model = new DefaultListModel<AliasID>(); DefaultListModel<AliasID> model = new DefaultListModel<AliasID>();
List<AliasID> ids = mAlias.getId(); List<AliasID> ids = alias.getId();
Collections.sort( ids, new Comparator<AliasID>() Collections.sort( ids, new Comparator<AliasID>()
{ {
@@ -216,16 +241,19 @@ public class AliasIdentifierEditor extends AliasConfigurationEditor
if( mEditorContainer.isModified() ) if( mEditorContainer.isModified() )
{ {
mEditorContainer.save(); mEditorContainer.save();
if( hasItem() )
{
mAliasModel.broadcast( new AliasEvent( getItem(), Event.CHANGE ) );
}
} }
mAliasModel.broadcast( new AliasEvent( mAlias, Event.CHANGE ) );
} }
public class EditorContainer extends JPanel public class EditorContainer extends JPanel
{ {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private ComponentEditor<AliasID> mEditor = new EmptyAliasIDEditor(); private Editor<AliasID> mEditor = new EmptyEditor<>();
public EditorContainer() public EditorContainer()
{ {
@@ -273,6 +301,7 @@ public class AliasIdentifierEditor extends AliasConfigurationEditor
} }
removeAll(); removeAll();
//This will always give us an editor
mEditor = AliasFactory.getEditor( aliasID ); mEditor = AliasFactory.getEditor( aliasID );
add( mEditor ); add( mEditor );
@@ -283,16 +312,18 @@ public class AliasIdentifierEditor extends AliasConfigurationEditor
private void addAliasIDToList( final AliasID id ) private void addAliasIDToList( final AliasID id )
{ {
if( id != null && mAlias != null ) if( id != null && hasItem() )
{ {
mAlias.addAliasID( id ); final Alias alias = getItem();
alias.addAliasID( id );
EventQueue.invokeLater( new Runnable() EventQueue.invokeLater( new Runnable()
{ {
@Override @Override
public void run() public void run()
{ {
setAlias( mAlias ); setItem( alias );
mAliasIDList.setSelectedValue( id, true ); mAliasIDList.setSelectedValue( id, true );
} }

View File

@@ -17,6 +17,8 @@
******************************************************************************/ ******************************************************************************/
package alias.id.esn; package alias.id.esn;
import gui.editor.DocumentListenerEditor;
import java.awt.Color; import java.awt.Color;
import java.awt.Cursor; import java.awt.Cursor;
import java.awt.event.MouseAdapter; import java.awt.event.MouseAdapter;
@@ -24,15 +26,12 @@ import java.awt.event.MouseEvent;
import javax.swing.JLabel; import javax.swing.JLabel;
import javax.swing.JOptionPane; import javax.swing.JOptionPane;
import javax.swing.JTextArea;
import javax.swing.JTextField; import javax.swing.JTextField;
import net.miginfocom.swing.MigLayout; import net.miginfocom.swing.MigLayout;
import alias.AliasID; import alias.id.AliasID;
import alias.ComponentEditor;
import alias.id.talkgroup.TalkgroupIDEditor;
public class ESNEditor extends ComponentEditor<AliasID> public class ESNEditor extends DocumentListenerEditor<AliasID>
{ {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@@ -47,11 +46,9 @@ public class ESNEditor extends ComponentEditor<AliasID>
public ESNEditor( AliasID aliasID ) public ESNEditor( AliasID aliasID )
{ {
super( aliasID );
initGUI(); initGUI();
setComponent( aliasID ); setItem( aliasID );
} }
private void initGUI() private void initGUI()
@@ -81,18 +78,18 @@ public class ESNEditor extends ComponentEditor<AliasID>
public Esn getEsn() public Esn getEsn()
{ {
if( getComponent() instanceof Esn ) if( getItem() instanceof Esn )
{ {
return (Esn)getComponent(); return (Esn)getItem();
} }
return null; return null;
} }
@Override @Override
public void setComponent( AliasID aliasID ) public void setItem( AliasID aliasID )
{ {
mComponent = aliasID; super.setItem( aliasID );
Esn esn = getEsn(); Esn esn = getEsn();

View File

@@ -26,8 +26,8 @@ import javax.swing.JPanel;
import javax.swing.JPopupMenu; import javax.swing.JPopupMenu;
import playlist.PlaylistManager; import playlist.PlaylistManager;
import alias.AliasIDNode;
import alias.AliasNode; import alias.AliasNode;
import alias.id.AliasIDNode;
public class ESNNode extends AliasIDNode public class ESNNode extends AliasIDNode
{ {

View File

@@ -19,8 +19,8 @@ package alias.id.esn;
import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlAttribute;
import alias.AliasID; import alias.id.AliasID;
import alias.AliasIDType; import alias.id.AliasIDType;
public class Esn extends AliasID public class Esn extends AliasID
{ {

View File

@@ -19,8 +19,8 @@ package alias.id.fleetsync;
import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlAttribute;
import alias.AliasID; import alias.id.AliasID;
import alias.AliasIDType; import alias.id.AliasIDType;
public class FleetsyncID extends AliasID public class FleetsyncID extends AliasID

View File

@@ -17,30 +17,27 @@
******************************************************************************/ ******************************************************************************/
package alias.id.fleetsync; package alias.id.fleetsync;
import gui.editor.DocumentListenerEditor;
import java.awt.Color; import java.awt.Color;
import java.awt.Cursor; import java.awt.Cursor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter; import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import javax.swing.JFormattedTextField; import javax.swing.JFormattedTextField;
import javax.swing.JLabel; import javax.swing.JLabel;
import javax.swing.JOptionPane; import javax.swing.JOptionPane;
import javax.swing.JTextArea;
import javax.swing.JTextField; import javax.swing.JTextField;
import javax.swing.text.MaskFormatter; import javax.swing.text.MaskFormatter;
import net.miginfocom.swing.MigLayout;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import controller.channel.Channel; import alias.id.AliasID;
import net.miginfocom.swing.MigLayout;
import alias.AliasID;
import alias.ComponentEditor;
import alias.id.esn.ESNEditor;
public class FleetsyncIDEditor extends ComponentEditor<AliasID> public class FleetsyncIDEditor extends DocumentListenerEditor<AliasID>
{ {
private final static Logger mLog = LoggerFactory.getLogger( FleetsyncIDEditor.class ); private final static Logger mLog = LoggerFactory.getLogger( FleetsyncIDEditor.class );
@@ -56,11 +53,9 @@ public class FleetsyncIDEditor extends ComponentEditor<AliasID>
public FleetsyncIDEditor( AliasID aliasID ) public FleetsyncIDEditor( AliasID aliasID )
{ {
super( aliasID );
initGUI(); initGUI();
setComponent( aliasID ); setItem( aliasID );
} }
private void initGUI() private void initGUI()
@@ -104,18 +99,18 @@ public class FleetsyncIDEditor extends ComponentEditor<AliasID>
public FleetsyncID getFleetsyncID() public FleetsyncID getFleetsyncID()
{ {
if( getComponent() instanceof FleetsyncID ) if( getItem() instanceof FleetsyncID )
{ {
return (FleetsyncID)getComponent(); return (FleetsyncID)getItem();
} }
return null; return null;
} }
@Override @Override
public void setComponent( AliasID aliasID ) public void setItem( AliasID aliasID )
{ {
mComponent = aliasID; super.setItem( aliasID );
FleetsyncID fleetsync = getFleetsyncID(); FleetsyncID fleetsync = getFleetsyncID();

View File

@@ -26,8 +26,8 @@ import javax.swing.JPanel;
import javax.swing.JPopupMenu; import javax.swing.JPopupMenu;
import playlist.PlaylistManager; import playlist.PlaylistManager;
import alias.AliasIDNode;
import alias.AliasNode; import alias.AliasNode;
import alias.id.AliasIDNode;
public class FleetsyncIDNode extends AliasIDNode public class FleetsyncIDNode extends AliasIDNode
{ {

View File

@@ -21,8 +21,8 @@ import javax.xml.bind.annotation.XmlAttribute;
import module.decode.lj1200.LJ1200Message; import module.decode.lj1200.LJ1200Message;
import module.decode.lj1200.LJ1200Message.Function; import module.decode.lj1200.LJ1200Message.Function;
import alias.AliasID; import alias.id.AliasID;
import alias.AliasIDType; import alias.id.AliasIDType;
public class LoJackFunctionAndID extends AliasID public class LoJackFunctionAndID extends AliasID
{ {

View File

@@ -17,6 +17,8 @@
******************************************************************************/ ******************************************************************************/
package alias.id.lojack; package alias.id.lojack;
import gui.editor.DocumentListenerEditor;
import java.awt.Color; import java.awt.Color;
import java.awt.Cursor; import java.awt.Cursor;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
@@ -34,10 +36,9 @@ import javax.swing.text.MaskFormatter;
import module.decode.lj1200.LJ1200Message; import module.decode.lj1200.LJ1200Message;
import module.decode.lj1200.LJ1200Message.Function; import module.decode.lj1200.LJ1200Message.Function;
import net.miginfocom.swing.MigLayout; import net.miginfocom.swing.MigLayout;
import alias.AliasID; import alias.id.AliasID;
import alias.ComponentEditor;
public class LoJackIDEditor extends ComponentEditor<AliasID> public class LoJackIDEditor extends DocumentListenerEditor<AliasID>
{ {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@@ -61,11 +62,9 @@ public class LoJackIDEditor extends ComponentEditor<AliasID>
public LoJackIDEditor( AliasID aliasID ) public LoJackIDEditor( AliasID aliasID )
{ {
super( aliasID );
initGUI(); initGUI();
setComponent( aliasID ); setItem( aliasID );
} }
private void initGUI() private void initGUI()
@@ -121,18 +120,18 @@ public class LoJackIDEditor extends ComponentEditor<AliasID>
public LoJackFunctionAndID getLoJackID() public LoJackFunctionAndID getLoJackID()
{ {
if( getComponent() instanceof LoJackFunctionAndID ) if( getItem() instanceof LoJackFunctionAndID )
{ {
return (LoJackFunctionAndID)getComponent(); return (LoJackFunctionAndID)getItem();
} }
return null; return null;
} }
@Override @Override
public void setComponent( AliasID aliasID ) public void setItem( AliasID aliasID )
{ {
mComponent = aliasID; super.setItem( aliasID );
LoJackFunctionAndID lojack = getLoJackID(); LoJackFunctionAndID lojack = getLoJackID();

View File

@@ -26,8 +26,8 @@ import javax.swing.JPanel;
import javax.swing.JPopupMenu; import javax.swing.JPopupMenu;
import playlist.PlaylistManager; import playlist.PlaylistManager;
import alias.AliasIDNode;
import alias.AliasNode; import alias.AliasNode;
import alias.id.AliasIDNode;
public class LoJackIDNode extends AliasIDNode public class LoJackIDNode extends AliasIDNode
{ {

View File

@@ -19,8 +19,8 @@ package alias.id.mdc;
import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlAttribute;
import alias.AliasID; import alias.id.AliasID;
import alias.AliasIDType; import alias.id.AliasIDType;
public class MDC1200ID extends AliasID public class MDC1200ID extends AliasID

View File

@@ -17,6 +17,8 @@
******************************************************************************/ ******************************************************************************/
package alias.id.mdc; package alias.id.mdc;
import gui.editor.DocumentListenerEditor;
import java.awt.Color; import java.awt.Color;
import java.awt.Cursor; import java.awt.Cursor;
import java.awt.event.MouseAdapter; import java.awt.event.MouseAdapter;
@@ -29,10 +31,9 @@ import javax.swing.JTextField;
import javax.swing.text.MaskFormatter; import javax.swing.text.MaskFormatter;
import net.miginfocom.swing.MigLayout; import net.miginfocom.swing.MigLayout;
import alias.AliasID; import alias.id.AliasID;
import alias.ComponentEditor;
public class MDC1200IDEditor extends ComponentEditor<AliasID> public class MDC1200IDEditor extends DocumentListenerEditor<AliasID>
{ {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@@ -47,11 +48,9 @@ public class MDC1200IDEditor extends ComponentEditor<AliasID>
public MDC1200IDEditor( AliasID aliasID ) public MDC1200IDEditor( AliasID aliasID )
{ {
super( aliasID );
initGUI(); initGUI();
setComponent( aliasID ); setItem( aliasID );
} }
private void initGUI() private void initGUI()
@@ -94,18 +93,18 @@ public class MDC1200IDEditor extends ComponentEditor<AliasID>
public MDC1200ID getMDC1200ID() public MDC1200ID getMDC1200ID()
{ {
if( getComponent() instanceof MDC1200ID ) if( getItem() instanceof MDC1200ID )
{ {
return (MDC1200ID)getComponent(); return (MDC1200ID)getItem();
} }
return null; return null;
} }
@Override @Override
public void setComponent( AliasID aliasID ) public void setItem( AliasID aliasID )
{ {
mComponent = aliasID; super.setItem( aliasID );
MDC1200ID mdc = getMDC1200ID(); MDC1200ID mdc = getMDC1200ID();

View File

@@ -26,8 +26,8 @@ import javax.swing.JPanel;
import javax.swing.JPopupMenu; import javax.swing.JPopupMenu;
import playlist.PlaylistManager; import playlist.PlaylistManager;
import alias.AliasIDNode;
import alias.AliasNode; import alias.AliasNode;
import alias.id.AliasIDNode;
public class MDC1200IDNode extends AliasIDNode public class MDC1200IDNode extends AliasIDNode
{ {

View File

@@ -17,6 +17,8 @@
******************************************************************************/ ******************************************************************************/
package alias.id.mobileID; package alias.id.mobileID;
import gui.editor.DocumentListenerEditor;
import java.awt.Color; import java.awt.Color;
import java.awt.Cursor; import java.awt.Cursor;
import java.awt.event.MouseAdapter; import java.awt.event.MouseAdapter;
@@ -25,16 +27,13 @@ import java.awt.event.MouseEvent;
import javax.swing.JFormattedTextField; import javax.swing.JFormattedTextField;
import javax.swing.JLabel; import javax.swing.JLabel;
import javax.swing.JOptionPane; import javax.swing.JOptionPane;
import javax.swing.JTextArea;
import javax.swing.JTextField; import javax.swing.JTextField;
import javax.swing.text.MaskFormatter; import javax.swing.text.MaskFormatter;
import net.miginfocom.swing.MigLayout; import net.miginfocom.swing.MigLayout;
import alias.AliasID; import alias.id.AliasID;
import alias.ComponentEditor;
import alias.id.esn.ESNEditor;
public class MINEditor extends ComponentEditor<AliasID> public class MINEditor extends DocumentListenerEditor<AliasID>
{ {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@@ -49,11 +48,9 @@ public class MINEditor extends ComponentEditor<AliasID>
public MINEditor( AliasID aliasID ) public MINEditor( AliasID aliasID )
{ {
super( aliasID );
initGUI(); initGUI();
setComponent( aliasID ); setItem( aliasID );
} }
private void initGUI() private void initGUI()
@@ -96,18 +93,18 @@ public class MINEditor extends ComponentEditor<AliasID>
public Min getMin() public Min getMin()
{ {
if( getComponent() instanceof Min ) if( getItem() instanceof Min )
{ {
return (Min)getComponent(); return (Min)getItem();
} }
return null; return null;
} }
@Override @Override
public void setComponent( AliasID aliasID ) public void setItem( AliasID aliasID )
{ {
mComponent = aliasID; super.setItem( aliasID );
Min min = getMin(); Min min = getMin();

View File

@@ -26,8 +26,8 @@ import javax.swing.JPanel;
import javax.swing.JPopupMenu; import javax.swing.JPopupMenu;
import playlist.PlaylistManager; import playlist.PlaylistManager;
import alias.AliasIDNode;
import alias.AliasNode; import alias.AliasNode;
import alias.id.AliasIDNode;
public class MINNode extends AliasIDNode public class MINNode extends AliasIDNode
{ {

View File

@@ -19,8 +19,8 @@ package alias.id.mobileID;
import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlAttribute;
import alias.AliasID; import alias.id.AliasID;
import alias.AliasIDType; import alias.id.AliasIDType;
/** /**
* Mobile ID Number * Mobile ID Number

View File

@@ -19,8 +19,8 @@ package alias.id.mpt1327;
import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlAttribute;
import alias.AliasID; import alias.id.AliasID;
import alias.AliasIDType; import alias.id.AliasIDType;
public class MPT1327ID extends AliasID public class MPT1327ID extends AliasID
{ {

View File

@@ -17,6 +17,8 @@
******************************************************************************/ ******************************************************************************/
package alias.id.mpt1327; package alias.id.mpt1327;
import gui.editor.DocumentListenerEditor;
import java.awt.Color; import java.awt.Color;
import java.awt.Cursor; import java.awt.Cursor;
import java.awt.event.MouseAdapter; import java.awt.event.MouseAdapter;
@@ -29,10 +31,9 @@ import javax.swing.JTextField;
import javax.swing.text.MaskFormatter; import javax.swing.text.MaskFormatter;
import net.miginfocom.swing.MigLayout; import net.miginfocom.swing.MigLayout;
import alias.AliasID; import alias.id.AliasID;
import alias.ComponentEditor;
public class MPT1327IDEditor extends ComponentEditor<AliasID> public class MPT1327IDEditor extends DocumentListenerEditor<AliasID>
{ {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@@ -48,11 +49,9 @@ public class MPT1327IDEditor extends ComponentEditor<AliasID>
public MPT1327IDEditor( AliasID aliasID ) public MPT1327IDEditor( AliasID aliasID )
{ {
super( aliasID );
initGUI(); initGUI();
setComponent( aliasID ); setItem( aliasID );
} }
private void initGUI() private void initGUI()
@@ -96,18 +95,18 @@ public class MPT1327IDEditor extends ComponentEditor<AliasID>
public MPT1327ID getMPT1327ID() public MPT1327ID getMPT1327ID()
{ {
if( getComponent() instanceof MPT1327ID ) if( getItem() instanceof MPT1327ID )
{ {
return (MPT1327ID)getComponent(); return (MPT1327ID)getItem();
} }
return null; return null;
} }
@Override @Override
public void setComponent( AliasID aliasID ) public void setItem( AliasID aliasID )
{ {
mComponent = aliasID; super.setItem( aliasID );
MPT1327ID mpt = getMPT1327ID(); MPT1327ID mpt = getMPT1327ID();

View File

@@ -26,8 +26,8 @@ import javax.swing.JPanel;
import javax.swing.JPopupMenu; import javax.swing.JPopupMenu;
import playlist.PlaylistManager; import playlist.PlaylistManager;
import alias.AliasIDNode;
import alias.AliasNode; import alias.AliasNode;
import alias.id.AliasIDNode;
public class MPT1327IDNode extends AliasIDNode public class MPT1327IDNode extends AliasIDNode
{ {

View File

@@ -1,7 +1,7 @@
package alias.id.nonrecordable; package alias.id.nonrecordable;
import alias.AliasID; import alias.id.AliasID;
import alias.AliasIDType; import alias.id.AliasIDType;
public class NonRecordable extends AliasID public class NonRecordable extends AliasID
{ {
@@ -20,6 +20,6 @@ public class NonRecordable extends AliasID
@Override @Override
public String toString() public String toString()
{ {
return "Non-Recordable"; return "Audio Non-Recordable";
} }
} }

View File

@@ -17,6 +17,8 @@
******************************************************************************/ ******************************************************************************/
package alias.id.nonrecordable; package alias.id.nonrecordable;
import gui.editor.DocumentListenerEditor;
import java.awt.Color; import java.awt.Color;
import java.awt.Cursor; import java.awt.Cursor;
import java.awt.event.MouseAdapter; import java.awt.event.MouseAdapter;
@@ -26,26 +28,23 @@ import javax.swing.JLabel;
import javax.swing.JOptionPane; import javax.swing.JOptionPane;
import net.miginfocom.swing.MigLayout; import net.miginfocom.swing.MigLayout;
import alias.AliasID; import alias.id.AliasID;
import alias.ComponentEditor;
public class NonRecordableEditor extends ComponentEditor<AliasID> public class NonRecordableEditor extends DocumentListenerEditor<AliasID>
{ {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private static final String HELP_TEXT = "<html>" private static final String HELP_TEXT = "<html>"
+ "<h3>Non-Recordable Example</h3>" + "<h3>Audio Non-Recordable Example</h3>"
+ "This identifies an alias as non-recordable.<br><br>" + "This identifies an alias as non-recordable.<br><br>"
+ "The alias can still be monitored but it will not be recorded<br>" + "The alias can still be monitored but associated audio will not be recorded<br>"
+ "when recording is enabled for the decoding channel."; + "when recording is enabled for the decoding channel.";
public NonRecordableEditor( AliasID aliasID ) public NonRecordableEditor( AliasID aliasID )
{ {
super( aliasID );
initGUI(); initGUI();
setComponent( aliasID ); setItem( aliasID );
} }
private void initGUI() private void initGUI()
@@ -63,17 +62,12 @@ public class NonRecordableEditor extends ComponentEditor<AliasID>
public void mouseClicked( MouseEvent e ) public void mouseClicked( MouseEvent e )
{ {
JOptionPane.showMessageDialog( NonRecordableEditor.this, JOptionPane.showMessageDialog( NonRecordableEditor.this,
HELP_TEXT, "Examples", JOptionPane.INFORMATION_MESSAGE ); HELP_TEXT, "Example", JOptionPane.INFORMATION_MESSAGE );
} }
} ); } );
add( example ); add( example );
} }
@Override
public void setComponent( AliasID aliasID )
{
}
@Override @Override
public void save() public void save()
{ {

View File

@@ -26,9 +26,9 @@ import javax.swing.JPanel;
import javax.swing.JPopupMenu; import javax.swing.JPopupMenu;
import playlist.PlaylistManager; import playlist.PlaylistManager;
import alias.AliasID;
import alias.AliasIDNode;
import alias.AliasNode; import alias.AliasNode;
import alias.id.AliasID;
import alias.id.AliasIDNode;
public class NonRecordableNode extends AliasIDNode public class NonRecordableNode extends AliasIDNode
{ {

View File

@@ -19,8 +19,8 @@ package alias.id.priority;
import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlAttribute;
import alias.AliasID; import alias.id.AliasID;
import alias.AliasIDType; import alias.id.AliasIDType;
/** /**
* Specifies an (audio) priority level for this alias. * Specifies an (audio) priority level for this alias.
@@ -60,7 +60,7 @@ public class Priority extends AliasID
public String toString() public String toString()
{ {
return "Priority: " + ( isDoNotMonitor() ? "Do Not Monitor" : mPriority ); return "Audio Priority: " + ( isDoNotMonitor() ? "Do Not Monitor" : mPriority );
} }
@Override @Override

View File

@@ -17,6 +17,8 @@
******************************************************************************/ ******************************************************************************/
package alias.id.priority; package alias.id.priority;
import gui.editor.DocumentListenerEditor;
import java.awt.Color; import java.awt.Color;
import java.awt.Cursor; import java.awt.Cursor;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
@@ -32,17 +34,16 @@ import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener; import javax.swing.event.ChangeListener;
import net.miginfocom.swing.MigLayout; import net.miginfocom.swing.MigLayout;
import alias.AliasID; import alias.id.AliasID;
import alias.ComponentEditor;
public class PriorityEditor extends ComponentEditor<AliasID> public class PriorityEditor extends DocumentListenerEditor<AliasID>
{ {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
public static final String DO_NOT_MONITOR = "Do Not Monitor"; public static final String DO_NOT_MONITOR = "Do Not Monitor";
private static final String HELP_TEXT = "<html>" private static final String HELP_TEXT = "<html>"
+ "<h3>Call Priority Example</h3>" + "<h3>Call Audio Priority Example</h3>"
+ "Priority determines which calls have priority for playback<br>" + "Priority determines which calls have priority for playback<br>"
+ "over your computer speakers, or designates an alias for<br>" + "over your computer speakers, or designates an alias for<br>"
+ "no-monitoring if you don't want to hear calls from an alias.<br><br>" + "no-monitoring if you don't want to hear calls from an alias.<br><br>"
@@ -55,11 +56,9 @@ public class PriorityEditor extends ComponentEditor<AliasID>
public PriorityEditor( AliasID aliasID ) public PriorityEditor( AliasID aliasID )
{ {
super( aliasID );
initGUI(); initGUI();
setComponent( aliasID ); setItem( aliasID );
} }
private void initGUI() private void initGUI()
@@ -119,18 +118,18 @@ public class PriorityEditor extends ComponentEditor<AliasID>
public Priority getPriority() public Priority getPriority()
{ {
if( getComponent() instanceof Priority ) if( getItem() instanceof Priority )
{ {
return (Priority)getComponent(); return (Priority)getItem();
} }
return null; return null;
} }
@Override @Override
public void setComponent( AliasID aliasID ) public void setItem( AliasID aliasID )
{ {
mComponent = aliasID; super.setItem( aliasID );
Priority priority = getPriority(); Priority priority = getPriority();

View File

@@ -26,8 +26,8 @@ import javax.swing.JPanel;
import javax.swing.JPopupMenu; import javax.swing.JPopupMenu;
import playlist.PlaylistManager; import playlist.PlaylistManager;
import alias.AliasIDNode;
import alias.AliasNode; import alias.AliasNode;
import alias.id.AliasIDNode;
public class PriorityNode extends AliasIDNode public class PriorityNode extends AliasIDNode
{ {

View File

@@ -19,8 +19,8 @@ package alias.id.siteID;
import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlAttribute;
import alias.AliasID; import alias.id.AliasID;
import alias.AliasIDType; import alias.id.AliasIDType;
public class SiteID extends AliasID public class SiteID extends AliasID
{ {

View File

@@ -17,6 +17,8 @@
******************************************************************************/ ******************************************************************************/
package alias.id.siteID; package alias.id.siteID;
import gui.editor.DocumentListenerEditor;
import java.awt.Color; import java.awt.Color;
import java.awt.Cursor; import java.awt.Cursor;
import java.awt.event.MouseAdapter; import java.awt.event.MouseAdapter;
@@ -27,10 +29,9 @@ import javax.swing.JOptionPane;
import javax.swing.JTextField; import javax.swing.JTextField;
import net.miginfocom.swing.MigLayout; import net.miginfocom.swing.MigLayout;
import alias.AliasID; import alias.id.AliasID;
import alias.ComponentEditor;
public class SiteIDEditor extends ComponentEditor<AliasID> public class SiteIDEditor extends DocumentListenerEditor<AliasID>
{ {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@@ -47,11 +48,9 @@ public class SiteIDEditor extends ComponentEditor<AliasID>
public SiteIDEditor( AliasID aliasID ) public SiteIDEditor( AliasID aliasID )
{ {
super( aliasID );
initGUI(); initGUI();
setComponent( aliasID ); setItem( aliasID );
} }
private void initGUI() private void initGUI()
@@ -82,18 +81,18 @@ public class SiteIDEditor extends ComponentEditor<AliasID>
public SiteID getSiteID() public SiteID getSiteID()
{ {
if( getComponent() instanceof SiteID ) if( getItem() instanceof SiteID )
{ {
return (SiteID)getComponent(); return (SiteID)getItem();
} }
return null; return null;
} }
@Override @Override
public void setComponent( AliasID aliasID ) public void setItem( AliasID aliasID )
{ {
mComponent = aliasID; super.setItem( aliasID );
SiteID siteID = getSiteID(); SiteID siteID = getSiteID();

View File

@@ -26,8 +26,8 @@ import javax.swing.JPanel;
import javax.swing.JPopupMenu; import javax.swing.JPopupMenu;
import playlist.PlaylistManager; import playlist.PlaylistManager;
import alias.AliasIDNode;
import alias.AliasNode; import alias.AliasNode;
import alias.id.AliasIDNode;
public class SiteIDNode extends AliasIDNode public class SiteIDNode extends AliasIDNode
{ {

View File

@@ -19,8 +19,8 @@ package alias.id.status;
import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlAttribute;
import alias.AliasID; import alias.id.AliasID;
import alias.AliasIDType; import alias.id.AliasIDType;
public class StatusID extends AliasID public class StatusID extends AliasID
{ {

View File

@@ -17,6 +17,8 @@
******************************************************************************/ ******************************************************************************/
package alias.id.status; package alias.id.status;
import gui.editor.DocumentListenerEditor;
import java.awt.Color; import java.awt.Color;
import java.awt.Cursor; import java.awt.Cursor;
import java.awt.event.MouseAdapter; import java.awt.event.MouseAdapter;
@@ -29,10 +31,9 @@ import javax.swing.JTextField;
import javax.swing.text.MaskFormatter; import javax.swing.text.MaskFormatter;
import net.miginfocom.swing.MigLayout; import net.miginfocom.swing.MigLayout;
import alias.AliasID; import alias.id.AliasID;
import alias.ComponentEditor;
public class StatusIDEditor extends ComponentEditor<AliasID> public class StatusIDEditor extends DocumentListenerEditor<AliasID>
{ {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@@ -49,11 +50,9 @@ public class StatusIDEditor extends ComponentEditor<AliasID>
public StatusIDEditor( AliasID aliasID ) public StatusIDEditor( AliasID aliasID )
{ {
super( aliasID );
initGUI(); initGUI();
setComponent( aliasID ); setItem( aliasID );
} }
private void initGUI() private void initGUI()
@@ -96,18 +95,18 @@ public class StatusIDEditor extends ComponentEditor<AliasID>
public StatusID getStatusID() public StatusID getStatusID()
{ {
if( getComponent() instanceof StatusID ) if( getItem() instanceof StatusID )
{ {
return (StatusID)getComponent(); return (StatusID)getItem();
} }
return null; return null;
} }
@Override @Override
public void setComponent( AliasID aliasID ) public void setItem( AliasID aliasID )
{ {
mComponent = aliasID; super.setItem( aliasID );
StatusID statusID = getStatusID(); StatusID statusID = getStatusID();

View File

@@ -26,8 +26,8 @@ import javax.swing.JPanel;
import javax.swing.JPopupMenu; import javax.swing.JPopupMenu;
import playlist.PlaylistManager; import playlist.PlaylistManager;
import alias.AliasIDNode;
import alias.AliasNode; import alias.AliasNode;
import alias.id.AliasIDNode;
public class StatusIDNode extends AliasIDNode public class StatusIDNode extends AliasIDNode
{ {

View File

@@ -19,8 +19,8 @@ package alias.id.talkgroup;
import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlAttribute;
import alias.AliasID; import alias.id.AliasID;
import alias.AliasIDType; import alias.id.AliasIDType;
import audio.inverted.AudioType; import audio.inverted.AudioType;

View File

@@ -17,6 +17,8 @@
******************************************************************************/ ******************************************************************************/
package alias.id.talkgroup; package alias.id.talkgroup;
import gui.editor.DocumentListenerEditor;
import java.awt.Color; import java.awt.Color;
import java.awt.Cursor; import java.awt.Cursor;
import java.awt.event.MouseAdapter; import java.awt.event.MouseAdapter;
@@ -27,10 +29,9 @@ import javax.swing.JOptionPane;
import javax.swing.JTextField; import javax.swing.JTextField;
import net.miginfocom.swing.MigLayout; import net.miginfocom.swing.MigLayout;
import alias.AliasID; import alias.id.AliasID;
import alias.ComponentEditor;
public class TalkgroupIDEditor extends ComponentEditor<AliasID> public class TalkgroupIDEditor extends DocumentListenerEditor<AliasID>
{ {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@@ -47,11 +48,9 @@ public class TalkgroupIDEditor extends ComponentEditor<AliasID>
public TalkgroupIDEditor( AliasID aliasID ) public TalkgroupIDEditor( AliasID aliasID )
{ {
super( aliasID );
initGUI(); initGUI();
setComponent( aliasID ); setItem( aliasID );
} }
private void initGUI() private void initGUI()
@@ -82,18 +81,18 @@ public class TalkgroupIDEditor extends ComponentEditor<AliasID>
public TalkgroupID getTalkgroupID() public TalkgroupID getTalkgroupID()
{ {
if( getComponent() instanceof TalkgroupID ) if( getItem() instanceof TalkgroupID )
{ {
return (TalkgroupID)getComponent(); return (TalkgroupID)getItem();
} }
return null; return null;
} }
@Override @Override
public void setComponent( AliasID aliasID ) public void setItem( AliasID aliasID )
{ {
mComponent = aliasID; super.setItem( aliasID );
TalkgroupID talkgroup = getTalkgroupID(); TalkgroupID talkgroup = getTalkgroupID();

View File

@@ -26,8 +26,8 @@ import javax.swing.JPanel;
import javax.swing.JPopupMenu; import javax.swing.JPopupMenu;
import playlist.PlaylistManager; import playlist.PlaylistManager;
import alias.AliasIDNode;
import alias.AliasNode; import alias.AliasNode;
import alias.id.AliasIDNode;
public class TalkgroupIDNode extends AliasIDNode public class TalkgroupIDNode extends AliasIDNode
{ {

View File

@@ -19,8 +19,8 @@ package alias.id.uniqueID;
import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlAttribute;
import alias.AliasID; import alias.id.AliasID;
import alias.AliasIDType; import alias.id.AliasIDType;
public class UniqueID extends AliasID public class UniqueID extends AliasID
{ {

View File

@@ -17,6 +17,8 @@
******************************************************************************/ ******************************************************************************/
package alias.id.uniqueID; package alias.id.uniqueID;
import gui.editor.DocumentListenerEditor;
import java.awt.Color; import java.awt.Color;
import java.awt.Cursor; import java.awt.Cursor;
import java.awt.event.MouseAdapter; import java.awt.event.MouseAdapter;
@@ -27,10 +29,9 @@ import javax.swing.JOptionPane;
import javax.swing.JTextField; import javax.swing.JTextField;
import net.miginfocom.swing.MigLayout; import net.miginfocom.swing.MigLayout;
import alias.AliasID; import alias.id.AliasID;
import alias.ComponentEditor;
public class UniqueIDEditor extends ComponentEditor<AliasID> public class UniqueIDEditor extends DocumentListenerEditor<AliasID>
{ {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@@ -44,11 +45,9 @@ public class UniqueIDEditor extends ComponentEditor<AliasID>
public UniqueIDEditor( AliasID aliasID ) public UniqueIDEditor( AliasID aliasID )
{ {
super( aliasID );
initGUI(); initGUI();
setComponent( aliasID ); setItem( aliasID );
} }
private void initGUI() private void initGUI()
@@ -78,18 +77,18 @@ public class UniqueIDEditor extends ComponentEditor<AliasID>
public UniqueID getUniqueID() public UniqueID getUniqueID()
{ {
if( getComponent() instanceof UniqueID ) if( getItem() instanceof UniqueID )
{ {
return (UniqueID)getComponent(); return (UniqueID)getItem();
} }
return null; return null;
} }
@Override @Override
public void setComponent( AliasID aliasID ) public void setItem( AliasID aliasID )
{ {
mComponent = aliasID; super.setItem( aliasID );
UniqueID uid = getUniqueID(); UniqueID uid = getUniqueID();

View File

@@ -26,8 +26,8 @@ import javax.swing.JPanel;
import javax.swing.JPopupMenu; import javax.swing.JPopupMenu;
import playlist.PlaylistManager; import playlist.PlaylistManager;
import alias.AliasIDNode;
import alias.AliasNode; import alias.AliasNode;
import alias.id.AliasIDNode;
public class UniqueIDNode extends AliasIDNode public class UniqueIDNode extends AliasIDNode
{ {

View File

@@ -0,0 +1,29 @@
package gui.editor;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
public abstract class DocumentListenerEditor<T> extends Editor<T>
implements DocumentListener
{
private static final long serialVersionUID = 1L;
public DocumentListenerEditor()
{
}
@Override
public void insertUpdate( DocumentEvent e )
{
setModified( true );
}
@Override
public void removeUpdate( DocumentEvent e )
{
setModified( true );
}
@Override
public void changedUpdate( DocumentEvent e ) { }
}

View File

@@ -0,0 +1,94 @@
package gui.editor;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import alias.id.AliasIdentifierEditor;
/**
* Generic editor with change detection, save and reset functions.
*/
public abstract class Editor<T> extends JPanel
{
private static final long serialVersionUID = 1L;
private final static Logger mLog = LoggerFactory.getLogger( Editor.class );
protected T mItem;
protected boolean mModified = false;
public Editor()
{
}
/**
* Sets the object to be edited
*/
public void setItem( T item )
{
if( isModified() )
{
int option = JOptionPane.showConfirmDialog(
Editor.this,
"This item has changed. Do you want to save these changes?",
"Save Changes?",
JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE );
if( option == JOptionPane.YES_OPTION )
{
save();
}
setModified( false );
}
mItem = item;
}
/**
* Current editing item
*/
public T getItem()
{
return mItem;
}
public boolean hasItem()
{
return mItem != null;
}
/**
* Sets the contents modified flag
*/
public void setModified( boolean modified )
{
mModified = modified;
}
/**
* Indicates if this editor contents have been modified
*/
public boolean isModified()
{
return mModified;
}
/**
* Save the contents of the editor
*/
public abstract void save();
/**
* Reset the contents of the editor without saving any changes
*/
public void reset()
{
mModified = false;
setItem( mItem );
}
}

View File

@@ -0,0 +1,26 @@
package gui.editor;
import javax.swing.JLabel;
import net.miginfocom.swing.MigLayout;
public class EmptyEditor<T> extends Editor<T>
{
private static final long serialVersionUID = 1L;
public EmptyEditor()
{
setLayout( new MigLayout( "", "[center]", "[grow]" ) );
add( new JLabel( "Please select an item" ), "wrap" );
}
@Override
public void save()
{
}
@Override
public void reset()
{
}
}

View File

@@ -599,7 +599,6 @@ public class ProcessingChain implements IChannelEventListener
*/ */
public void addMessageListener( Listener<Message> listener ) public void addMessageListener( Listener<Message> listener )
{ {
mLog.debug( "Registering Message Listener:" + listener.getClass() );
mMessageBroadcaster.addListener( listener ); mMessageBroadcaster.addListener( listener );
} }