diff --git a/src/alias/Alias.java b/src/alias/Alias.java index 1f29d060..46aef07c 100644 --- a/src/alias/Alias.java +++ b/src/alias/Alias.java @@ -27,6 +27,8 @@ import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlSeeAlso; import alias.action.AliasAction; +import alias.id.AliasID; +import alias.id.AliasIDType; import alias.id.priority.Priority; @XmlSeeAlso( { AliasID.class, AliasAction.class } ) diff --git a/src/alias/AliasController.java b/src/alias/AliasController.java index f30c0e0f..77fa19c9 100644 --- a/src/alias/AliasController.java +++ b/src/alias/AliasController.java @@ -55,11 +55,12 @@ public class AliasController extends JPanel mAliasModel = aliasModel; mEditor = new AliasEditor( mAliasModel, settingsManager ); - mAliasModel.addListener( mEditor ); mIconCellRenderer = new IconCellRenderer( settingsManager ); init(); + + mAliasModel.addListener( mEditor ); } private void init() @@ -124,7 +125,7 @@ public class AliasController extends JPanel @Override 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() ) { int selectedRow = mAliasTable.getSelectedRow(); @@ -137,14 +138,14 @@ public class AliasController extends JPanel if( alias != null ) { - mEditor.setAlias( alias ); + mEditor.setItem( alias ); mCopyButton.setEnabled( true ); mDeleteButton.setEnabled( true ); } } else { - mEditor.setAlias( null ); + mEditor.setItem( null ); mCopyButton.setEnabled( false ); mDeleteButton.setEnabled( false ); } diff --git a/src/alias/AliasEditor.java b/src/alias/AliasEditor.java index 03140636..75c176e4 100644 --- a/src/alias/AliasEditor.java +++ b/src/alias/AliasEditor.java @@ -17,25 +17,34 @@ ******************************************************************************/ package alias; +import gui.editor.Editor; + import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JLabel; -import javax.swing.JPanel; import javax.swing.JSeparator; import net.miginfocom.swing.MigLayout; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import sample.Listener; import settings.SettingsManager; import alias.AliasEvent.Event; +import alias.action.AliasActionEditor; +import alias.id.AliasIdentifierEditor; import com.jidesoft.swing.JideTabbedPane; -public class AliasEditor extends JPanel implements ActionListener, Listener +public class AliasEditor extends Editor implements ActionListener, Listener { private static final long serialVersionUID = 1L; + + private final static Logger mLog = LoggerFactory.getLogger( AliasEditor.class ); private static final String DEFAULT_NAME = "select an alias"; @@ -44,41 +53,44 @@ public class AliasEditor extends JPanel implements ActionListener, Listener + ******************************************************************************/ package alias; +import gui.editor.Editor; +import gui.editor.EmptyEditor; import alias.action.AliasAction; +import alias.action.AliasActionType; import alias.action.beep.BeepAction; +import alias.action.beep.BeepActionEditor; import alias.action.clip.ClipAction; +import alias.action.clip.ClipActionEditor; 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.Esn; import alias.id.fleetsync.FleetsyncID; import alias.id.fleetsync.FleetsyncIDEditor; -import alias.id.lojack.LoJackIDEditor; import alias.id.lojack.LoJackFunctionAndID; -import alias.id.mdc.MDC1200IDEditor; +import alias.id.lojack.LoJackIDEditor; import alias.id.mdc.MDC1200ID; +import alias.id.mdc.MDC1200IDEditor; import alias.id.mobileID.MINEditor; import alias.id.mobileID.Min; import alias.id.mpt1327.MPT1327ID; @@ -20,8 +45,8 @@ import alias.id.nonrecordable.NonRecordable; import alias.id.nonrecordable.NonRecordableEditor; import alias.id.priority.Priority; import alias.id.priority.PriorityEditor; -import alias.id.siteID.SiteIDEditor; import alias.id.siteID.SiteID; +import alias.id.siteID.SiteIDEditor; import alias.id.status.StatusID; import alias.id.status.StatusIDEditor; import alias.id.talkgroup.TalkgroupID; @@ -158,7 +183,7 @@ public class AliasFactory return copy; } - public static ComponentEditor getEditor( AliasID aliasID ) + public static Editor getEditor( AliasID aliasID ) { if( aliasID != null ) { @@ -193,28 +218,27 @@ public class AliasFactory } } - return new EmptyAliasIDEditor(); + return new EmptyEditor(); } - public static ComponentEditor getEditor( AliasAction aliasAction ) + public static Editor getEditor( AliasAction aliasAction ) { if( aliasAction != null ) { - if( aliasAction instanceof BeepAction ) + switch( aliasAction.getType() ) { - - } - else if( aliasAction instanceof ClipAction ) - { - - } - else if( aliasAction instanceof ScriptAction ) - { - + case BEEP: + return new BeepActionEditor( aliasAction ); + case CLIP: + return new ClipActionEditor( aliasAction ); + case SCRIPT: + return new ScriptActionEditor( aliasAction ); + default: + break; } } - return new EmptyAliasActionEditor(); + return new EmptyEditor(); } public static AliasID getAliasID( AliasIDType type ) @@ -249,4 +273,20 @@ public class AliasFactory 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 ); + } + } + } diff --git a/src/alias/AliasList.java b/src/alias/AliasList.java index 52eb6efe..e62ec72f 100644 --- a/src/alias/AliasList.java +++ b/src/alias/AliasList.java @@ -34,6 +34,7 @@ import alias.action.AliasAction; import alias.action.beep.BeepAction; import alias.action.clip.ClipAction; import alias.action.script.ScriptAction; +import alias.id.AliasID; import alias.id.esn.Esn; import alias.id.fleetsync.FleetsyncID; import alias.id.lojack.LoJackFunctionAndID; diff --git a/src/alias/AliasModel.java b/src/alias/AliasModel.java index 9542c9f1..f248ded6 100644 --- a/src/alias/AliasModel.java +++ b/src/alias/AliasModel.java @@ -48,7 +48,7 @@ public class AliasModel extends AbstractTableModel public static final int COLUMN_ICON = 3; public static final int COLUMN_COLOR = 4; - private List mAliases = new ArrayList<>(); + private List mAliases = new CopyOnWriteArrayList<>(); private Broadcaster mAliasEventBroadcaster = new Broadcaster<>(); public AliasModel() diff --git a/src/alias/AliasNameEditor.java b/src/alias/AliasNameEditor.java index 8455f836..3a99e098 100644 --- a/src/alias/AliasNameEditor.java +++ b/src/alias/AliasNameEditor.java @@ -1,5 +1,7 @@ package alias; +import gui.editor.Editor; + import java.awt.Color; import java.awt.Dimension; import java.awt.EventQueue; @@ -14,17 +16,24 @@ import javax.swing.JColorChooser; import javax.swing.JComboBox; import javax.swing.JLabel; 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.MapIcon; import map.MapIconListCellRenderer; import net.miginfocom.swing.MigLayout; import settings.SettingsManager; -public class AliasNameEditor extends AliasConfigurationEditor +public class AliasNameEditor extends Editor { private static final long serialVersionUID = 1L; - + private final static Logger mLog = LoggerFactory.getLogger( AliasNameEditor.class ); + private static ComboBoxModel EMPTY_MODEL = new DefaultComboBoxModel<>(); private JComboBox mListCombo = new JComboBox<>( EMPTY_MODEL ); @@ -34,7 +43,6 @@ public class AliasNameEditor extends AliasConfigurationEditor private JButton mButtonColor; private JButton mBtnIconManager; - private Alias mAlias; private AliasModel mAliasModel; private SettingsManager mSettingsManager; @@ -52,6 +60,23 @@ public class AliasNameEditor extends AliasConfigurationEditor add( new JLabel( "Name:" ) ); 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( new JLabel( "List:" ) ); @@ -76,12 +101,22 @@ public class AliasNameEditor extends AliasConfigurationEditor groups.toArray( new String[ groups.size() ] ) ) );; } } + + setModified( true ); } } ); add( mListCombo, "wrap" ); add( new JLabel( "Group:" ) ); mGroupCombo.setEditable( true ); + mGroupCombo.addActionListener( new ActionListener() + { + @Override + public void actionPerformed( ActionEvent e ) + { + setModified( true ); + } + } ); add( mGroupCombo, "wrap" ); add( new JLabel( "Color:" ) ); @@ -95,12 +130,14 @@ public class AliasNameEditor extends AliasConfigurationEditor Color newColor = JColorChooser.showDialog( AliasNameEditor.this, "Choose color for this alias", - ( mAlias != null ? mAlias.getMapColor() : null ) ); + ( hasItem() ? getItem().getMapColor() : null ) ); if( newColor != null ) { mButtonColor.setForeground( newColor ); mButtonColor.setBackground( newColor ); + + setModified( true ); } } } ); @@ -113,6 +150,14 @@ public class AliasNameEditor extends AliasConfigurationEditor MapIconListCellRenderer renderer = new MapIconListCellRenderer(); renderer.setPreferredSize( new Dimension( 200, 30 ) ); mMapIconCombo.setRenderer( renderer ); + mMapIconCombo.addActionListener( new ActionListener() + { + @Override + public void actionPerformed( ActionEvent e ) + { + setModified( true ); + } + } ); 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 - public void setAlias( Alias alias ) + public void setItem( Alias alias ) { - mAlias = alias; - - if( mAlias != null ) + super.setItem( alias ); + + if( hasItem() ) { mName.setText( alias.getName() ); @@ -163,9 +210,9 @@ public class AliasNameEditor extends AliasConfigurationEditor listNames.toArray( new String[ listNames.size() ] ) ) );; } - mListCombo.setSelectedItem( mAlias.getList() ); + mListCombo.setSelectedItem( alias.getList() ); - List groupNames = mAliasModel.getGroupNames( mAlias.getList() ); + List groupNames = mAliasModel.getGroupNames( alias.getList() ); if( groupNames.isEmpty() ) { @@ -177,14 +224,14 @@ public class AliasNameEditor extends AliasConfigurationEditor 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.setForeground( color ); - String iconName = mAlias.getIconName(); + String iconName = alias.getIconName(); if( iconName == null ) { @@ -207,31 +254,40 @@ public class AliasNameEditor extends AliasConfigurationEditor mButtonColor.setBackground( getBackground() ); mButtonColor.setForeground( getForeground() ); } + + setModified( false ); } @Override public void save() { - if( mAlias != null ) + if( hasItem() && isModified() ) { + Alias alias = getItem(); + if( mListCombo.getSelectedItem() != null ) { - mAlias.setList( (String)mListCombo.getSelectedItem() ); + alias.setList( (String)mListCombo.getSelectedItem() ); } 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 ) { - 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 ); } } diff --git a/src/alias/AliasNode.java b/src/alias/AliasNode.java index ca120982..634c5665 100644 --- a/src/alias/AliasNode.java +++ b/src/alias/AliasNode.java @@ -36,6 +36,7 @@ import alias.action.clip.ClipAction; import alias.action.clip.ClipActionNode; import alias.action.script.ScriptAction; import alias.action.script.ScriptActionNode; +import alias.id.AliasID; import alias.id.esn.ESNNode; import alias.id.esn.Esn; import alias.id.fleetsync.FleetsyncID; diff --git a/src/alias/ComponentEditor.java b/src/alias/ComponentEditor.java index 3de3d30c..9cc909bf 100644 --- a/src/alias/ComponentEditor.java +++ b/src/alias/ComponentEditor.java @@ -18,7 +18,6 @@ package alias; import javax.swing.JPanel; -import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; public abstract class ComponentEditor extends JPanel implements DocumentListener @@ -71,21 +70,6 @@ public abstract class ComponentEditor extends JPanel implements DocumentListe 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 ) { mListener = listener; diff --git a/src/alias/EmptyAliasActionEditor.java b/src/alias/EmptyAliasActionEditor.java deleted file mode 100644 index d00dfaa7..00000000 --- a/src/alias/EmptyAliasActionEditor.java +++ /dev/null @@ -1,32 +0,0 @@ -package alias; - -import javax.swing.JLabel; - -import net.miginfocom.swing.MigLayout; -import alias.action.AliasAction; - -public class EmptyAliasActionEditor extends ComponentEditor -{ - 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() - { - } -} diff --git a/src/alias/EmptyAliasIDEditor.java b/src/alias/EmptyAliasIDEditor.java deleted file mode 100644 index 3c7908f6..00000000 --- a/src/alias/EmptyAliasIDEditor.java +++ /dev/null @@ -1,31 +0,0 @@ -package alias; - -import javax.swing.JLabel; - -import net.miginfocom.swing.MigLayout; - -public class EmptyAliasIDEditor extends ComponentEditor -{ - 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() - { - } -} diff --git a/src/alias/action/AliasAction.java b/src/alias/action/AliasAction.java index b2d409b2..4d10dd29 100644 --- a/src/alias/action/AliasAction.java +++ b/src/alias/action/AliasAction.java @@ -19,6 +19,7 @@ package alias.action; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlSeeAlso; +import javax.xml.bind.annotation.XmlTransient; import message.Message; import alias.Alias; @@ -37,6 +38,9 @@ public abstract class AliasAction public AliasAction() { } + + @XmlTransient + public abstract AliasActionType getType(); /** * Task to execute when an alias action is defined. The message argument is diff --git a/src/alias/action/AliasActionEditor.java b/src/alias/action/AliasActionEditor.java new file mode 100644 index 00000000..96b0f9a9 --- /dev/null +++ b/src/alias/action/AliasActionEditor.java @@ -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 + ******************************************************************************/ +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 +{ + private static final long serialVersionUID = 1L; + + private final static Logger mLog = LoggerFactory.getLogger( AliasActionEditor.class ); + + private static ListModel EMPTY_MODEL = new DefaultListModel<>(); + private JList 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 model = new DefaultListModel<>(); + + List actions = alias.getAction(); + + Collections.sort( actions, new Comparator() + { + @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 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 ); + } + } ); + } + } +} diff --git a/src/alias/AliasActionListener.java b/src/alias/action/AliasActionListener.java similarity index 96% rename from src/alias/AliasActionListener.java rename to src/alias/action/AliasActionListener.java index 5c97948c..a967e446 100644 --- a/src/alias/AliasActionListener.java +++ b/src/alias/action/AliasActionListener.java @@ -15,7 +15,9 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see ******************************************************************************/ -package alias; +package alias.action; + +import alias.AliasEvent; /** * Interface for receiving alias events. Each listener will receive diff --git a/src/alias/AliasConfigurationEditor.java b/src/alias/action/AliasActionType.java similarity index 69% rename from src/alias/AliasConfigurationEditor.java rename to src/alias/action/AliasActionType.java index 1add4761..b54ddb06 100644 --- a/src/alias/AliasConfigurationEditor.java +++ b/src/alias/action/AliasActionType.java @@ -1,5 +1,4 @@ /******************************************************************************* - * SDR Trunk * Copyright (C) 2014-2016 Dennis Sheirer * @@ -16,21 +15,23 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see ******************************************************************************/ -package alias; +package alias.action; -import javax.swing.JPanel; - -public abstract class AliasConfigurationEditor extends JPanel +public enum AliasActionType { - private static final long serialVersionUID = 1L; - - /** - * Sets or resets the configuration editor components - */ - public abstract void setAlias( Alias alias ); - - /** - * Saves the contents of the editor components to the configuration - */ - public abstract void save(); + BEEP( "Beep" ), + CLIP( "Play Clip" ), + SCRIPT( "Run Script" ); + + private String mLabel; + + private AliasActionType( String label ) + { + mLabel = label; + } + + public String toString() + { + return mLabel; + } } diff --git a/src/alias/action/beep/BeepAction.java b/src/alias/action/beep/BeepAction.java index b260adbb..65ebd2bd 100644 --- a/src/alias/action/beep/BeepAction.java +++ b/src/alias/action/beep/BeepAction.java @@ -2,13 +2,27 @@ package alias.action.beep; import message.Message; import alias.Alias; +import alias.action.AliasActionType; import alias.action.RecurringAction; public class BeepAction extends RecurringAction { + + @Override + public AliasActionType getType() + { + return AliasActionType.BEEP; + } + @Override public void performAction( Alias alias, Message message ) { System.out.println( "\007" ); } + + @Override + public String toString() + { + return "Beep"; + } } diff --git a/src/alias/action/beep/BeepActionEditor.java b/src/alias/action/beep/BeepActionEditor.java index 7b5844f9..139f01e0 100644 --- a/src/alias/action/beep/BeepActionEditor.java +++ b/src/alias/action/beep/BeepActionEditor.java @@ -1,6 +1,6 @@ /******************************************************************************* * 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 * it under the terms of the GNU General Public License as published by @@ -17,59 +17,77 @@ ******************************************************************************/ 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.ActionListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; -import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JLabel; -import javax.swing.JPanel; +import javax.swing.JOptionPane; +import javax.swing.JSlider; import javax.swing.JSpinner; -import javax.swing.JTextArea; -import javax.swing.JTextField; import javax.swing.SpinnerModel; import javax.swing.SpinnerNumberModel; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import net.miginfocom.swing.MigLayout; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - +import alias.action.AliasAction; import alias.action.RecurringAction.Interval; +import alias.id.priority.Priority; -public class BeepActionEditor extends JPanel implements ActionListener +public class BeepActionEditor extends DocumentListenerEditor { private static final long serialVersionUID = 1L; - private final static Logger mLog = - LoggerFactory.getLogger( BeepActionEditor.class ); - - private BeepActionNode mBeepActionNode; - private JTextField mTextSiteID; - private JComboBox mComboInterval; - private JSpinner mSpinnerPeriod; + private static final String HELP_TEXT = + "

Beep Action

" + + "This action will sound a beep according to the interval
" + + "that you select:

" + + "Once: Beep the first time the alias is active and
" + + "never again

" + + "Once, Reset After Delay: Beep once and suppress
" + + "subsequent beeps for the specified period in seconds.
" + + "After the reset period, beep again when the alias is active.

" + + "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.
" + + ""; - public BeepActionEditor( BeepActionNode beepActionNode ) + private JComboBox mComboInterval; + private JSlider mPeriodSlider; + private JLabel mPeriodSliderLabel; + + public BeepActionEditor( AliasAction aliasAction ) { - mBeepActionNode = beepActionNode; - - initGUI(); + init(); + + setItem( aliasAction ); } - private void initGUI() + public BeepAction getBeepAction() { - setLayout( new MigLayout( "fill,wrap 2", "[right][left]", "[][][][][][grow]" ) ); - - add( new JLabel( "Action: Beep" ), "span,align center" ); + if( getItem() instanceof BeepAction ) + { + 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.values() ); - - mComboInterval.setSelectedItem( mBeepActionNode.getBeepAction().getInterval() ); - + mComboInterval.setToolTipText( HELP_TEXT ); mComboInterval.addActionListener( new ActionListener() { @Override @@ -81,71 +99,97 @@ public class BeepActionEditor extends JPanel implements ActionListener if( selected != null ) { /* 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" ); - final SpinnerModel model = new SpinnerNumberModel( - mBeepActionNode.getBeepAction().getPeriod(), 1, 30, 1 ); - + final SpinnerModel model = new SpinnerNumberModel( 1, 1, 30, 1 ); model.addChangeListener( new ChangeListener() { @Override public void stateChanged( ChangeEvent e ) { - mBeepActionNode.getBeepAction().setPeriod( (int)model.getValue() ); + setModified( true ); } } ); - mSpinnerPeriod = new JSpinner( model ); - - if( mBeepActionNode.getBeepAction().getInterval() == Interval.ONCE ) + mPeriodSlider = new JSlider( JSlider.HORIZONTAL, 1, 60, 1 ); + mPeriodSlider.setMajorTickSpacing( 10 ); + 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:" ) ); - 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" ); + setModified( false ); } @Override - public void actionPerformed( ActionEvent e ) - { - String command = e.getActionCommand(); - - if( command.contentEquals( "Save" ) ) + public void save() + { + if( hasItem() && isModified() ) { - mBeepActionNode.save(); - mBeepActionNode.show(); + BeepAction beep = getBeepAction(); + + beep.setInterval( (Interval)mComboInterval.getSelectedItem() ); + beep.setPeriod( mPeriodSlider.getValue() ); } - mBeepActionNode.refresh(); - } + setModified( false ); + } } diff --git a/src/alias/action/beep/BeepActionNode.java b/src/alias/action/beep/BeepActionNode.java index ba5fccdf..96de565e 100644 --- a/src/alias/action/beep/BeepActionNode.java +++ b/src/alias/action/beep/BeepActionNode.java @@ -41,7 +41,7 @@ public class BeepActionNode extends AliasActionNode @Override public JPanel getEditor() { - return new BeepActionEditor( this ); + return null; } public BeepAction getBeepAction() diff --git a/src/alias/action/clip/ClipAction.java b/src/alias/action/clip/ClipAction.java index 30e4c113..dd338d96 100644 --- a/src/alias/action/clip/ClipAction.java +++ b/src/alias/action/clip/ClipAction.java @@ -13,6 +13,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import alias.Alias; +import alias.action.AliasActionType; import alias.action.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() { - return mFilePath; } @@ -87,4 +93,18 @@ public class ClipAction extends RecurringAction throw e; } } + + + @Override + public String toString() + { + if( mFilePath == null ) + { + return "Play Clip"; + } + else + { + return "Play Clip: " + mFilePath; + } + } } diff --git a/src/alias/action/clip/ClipActionEditor.java b/src/alias/action/clip/ClipActionEditor.java index e07b4aee..070e0ce9 100644 --- a/src/alias/action/clip/ClipActionEditor.java +++ b/src/alias/action/clip/ClipActionEditor.java @@ -1,6 +1,6 @@ /******************************************************************************* * 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 * it under the terms of the GNU General Public License as published by @@ -17,9 +17,15 @@ ******************************************************************************/ package alias.action.clip; +import gui.editor.DocumentListenerEditor; + +import java.awt.Color; +import java.awt.Cursor; 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.io.File; import javax.swing.JButton; @@ -27,9 +33,7 @@ import javax.swing.JComboBox; import javax.swing.JFileChooser; import javax.swing.JLabel; import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JSpinner; -import javax.swing.JTextArea; +import javax.swing.JSlider; import javax.swing.JTextField; import javax.swing.SpinnerModel; import javax.swing.SpinnerNumberModel; @@ -37,43 +41,59 @@ import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import net.miginfocom.swing.MigLayout; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - +import alias.action.AliasAction; import alias.action.RecurringAction.Interval; +import alias.action.script.ScriptActionEditor; -public class ClipActionEditor extends JPanel implements ActionListener +public class ClipActionEditor extends DocumentListenerEditor { private static final long serialVersionUID = 1L; - private final static Logger mLog = - LoggerFactory.getLogger( ClipActionEditor.class ); - - private ClipActionNode mClipActionNode; + private static final String PLEASE_SELECT_A_FILE = "Please select a file"; + private static final String HELP_TEXT = + "

Clip Action

" + + "This action will play an audio clip according to the interval
" + + "that you select:

" + + "Once: play the first time the alias is active and
" + + "never again

" + + "Once, Reset After Delay: play once and suppress
" + + "subsequent runs for the specified period in seconds.
" + + "After the reset period, play again when the alias is active.

" + + "Until Dismissed: play every period seconds until you
" + + "click OK on the dialog that appears. Alerting is suppressed
" + + "for 15 seconds after you click OK.
" + + ""; + private JComboBox mComboInterval; - private JSpinner mSpinnerPeriod; + private JSlider mPeriodSlider; + private JLabel mPeriodSliderLabel; private JTextField mTextFilePath; - public ClipActionEditor( ClipActionNode clipActionNode ) + public ClipActionEditor( AliasAction aliasAction ) { - mClipActionNode = clipActionNode; - - initGUI(); + init(); + + setItem( aliasAction ); } - private void initGUI() + public ClipAction getClipAction() { - setLayout( new MigLayout( "fill,wrap 2", "[right][left]", "[][][][][][grow]" ) ); - - add( new JLabel( "Action: Audio Clip" ), "span,align center" ); + if( getItem() instanceof ClipAction ) + { + 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.values() ); - - mComboInterval.setSelectedItem( mClipActionNode.getClipAction().getInterval() ); - + mComboInterval.setToolTipText( HELP_TEXT ); mComboInterval.addActionListener( new ActionListener() { @Override @@ -84,37 +104,51 @@ public class ClipActionEditor extends JPanel implements ActionListener if( selected != null ) { - /* Enable/disable period spinner based on selection */ - mSpinnerPeriod.setEnabled( selected != Interval.ONCE ); + /* Enable/disable period slider based on selection */ + boolean enabled = selected != Interval.ONCE; - mClipActionNode.getClipAction().setInterval( selected ); + mPeriodSlider.setEnabled( enabled ); + mPeriodSliderLabel.setEnabled( enabled ); } + + setModified( true ); } }); - - add( mComboInterval, "wrap" ); + add( mComboInterval ); - final SpinnerModel model = new SpinnerNumberModel( - mClipActionNode.getClipAction().getPeriod(), 1, 30, 1 ); - + final SpinnerModel model = new SpinnerNumberModel( 1, 1, 30, 1 ); model.addChangeListener( new ChangeListener() { @Override public void stateChanged( ChangeEvent e ) { - mClipActionNode.getClipAction().setPeriod( (int)model.getValue() ); + setModified( true ); } } ); - mSpinnerPeriod = new JSpinner( model ); - - if( mClipActionNode.getClipAction().getInterval() == Interval.ONCE ) + mPeriodSlider = new JSlider( JSlider.HORIZONTAL, 1, 60, 1 ); + mPeriodSlider.setMajorTickSpacing( 10 ); + 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:" ) ); - add( mSpinnerPeriod, "wrap" ); + mPeriodSliderLabel = new JLabel( "Period: " + mPeriodSlider.getValue() + " " ); + add( mPeriodSliderLabel ); + add( mPeriodSlider, "wrap,grow" ); + + mTextFilePath = new JTextField( PLEASE_SELECT_A_FILE ); + add( mTextFilePath, "growx,span" ); JButton fileButton = new JButton( "File" ); @@ -131,88 +165,134 @@ public class ClipActionEditor extends JPanel implements ActionListener { File file = chooser.getSelectedFile(); - mClipActionNode.getClipAction().setPath( file.getAbsolutePath() ); mTextFilePath.setText( file.getAbsolutePath() ); + + setModified( true ); } } } ); - add( fileButton ); + add( fileButton, "grow" ); JButton testButton = new JButton( "Test" ); - testButton.addActionListener( new ActionListener() + + testButton.addActionListener( new ActionListener() { @Override - public void actionPerformed( ActionEvent actionEvent ) + public void actionPerformed( ActionEvent e ) { - String path = mClipActionNode.getClipAction().getPath(); - - if( path == null || path.trim().isEmpty() ) + if( hasItem() ) { - JOptionPane.showMessageDialog( ClipActionEditor.this, - "Please select an audio file", "Please select file", - JOptionPane.ERROR_MESSAGE ); - } - - EventQueue.invokeLater( new Runnable() - { - @Override - public void run() + String path = mTextFilePath.getText(); + + if( path == null || path.trim().isEmpty() ) { - try - { - mClipActionNode.getClipAction().play(); - } - catch( Exception e ) - { - JOptionPane.showMessageDialog( ClipActionEditor.this, - "Couldn't play audio clip [" + e.getMessage() + "]", - "Error", JOptionPane.ERROR_MESSAGE ); - } + JOptionPane.showMessageDialog( ClipActionEditor.this, + "Please select an audio file", PLEASE_SELECT_A_FILE, + 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" ); - sb.append( "Once - Play the first time the alias is active and never again.\n\n" ); - 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" ); - 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." ); + 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( 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() ); - - description.setLineWrap( true ); - description.setBackground( getBackground() ); - - add( description, "growx,span" ); - - JButton btnSave = new JButton( "Save" ); - btnSave.addActionListener( ClipActionEditor.this ); - add( btnSave, "growx,push" ); + if( hasItem() ) + { + ClipAction clip = getClipAction(); - JButton btnReset = new JButton( "Reset" ); - btnReset.addActionListener( ClipActionEditor.this ); - add( btnReset, "growx,push" ); + Interval interval = clip.getInterval(); + + 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 - public void actionPerformed( ActionEvent e ) - { - String command = e.getActionCommand(); - - if( command.contentEquals( "Save" ) ) + public void save() + { + if( hasItem() && isModified() ) { - mClipActionNode.save(); - mClipActionNode.show(); + ClipAction script = getClipAction(); + + script.setInterval( (Interval)mComboInterval.getSelectedItem() ); + script.setPeriod( mPeriodSlider.getValue() ); + script.setPath( mTextFilePath.getText() ); } - mClipActionNode.refresh(); - } + setModified( false ); + } } diff --git a/src/alias/action/clip/ClipActionNode.java b/src/alias/action/clip/ClipActionNode.java index 15f7005b..3e42a432 100644 --- a/src/alias/action/clip/ClipActionNode.java +++ b/src/alias/action/clip/ClipActionNode.java @@ -41,7 +41,7 @@ public class ClipActionNode extends AliasActionNode @Override public JPanel getEditor() { - return new ClipActionEditor( this ); + return null; } public ClipAction getClipAction() diff --git a/src/alias/action/script/ScriptAction.java b/src/alias/action/script/ScriptAction.java index de94ffc1..8dcfb55f 100644 --- a/src/alias/action/script/ScriptAction.java +++ b/src/alias/action/script/ScriptAction.java @@ -9,6 +9,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import alias.Alias; +import alias.action.AliasActionType; import alias.action.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() { 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; + } + } } diff --git a/src/alias/action/script/ScriptActionEditor.java b/src/alias/action/script/ScriptActionEditor.java index 22f2c77d..ea7e181e 100644 --- a/src/alias/action/script/ScriptActionEditor.java +++ b/src/alias/action/script/ScriptActionEditor.java @@ -1,6 +1,6 @@ /******************************************************************************* * 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 * it under the terms of the GNU General Public License as published by @@ -17,9 +17,16 @@ ******************************************************************************/ 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.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; import java.io.File; import javax.swing.JButton; @@ -27,9 +34,7 @@ import javax.swing.JComboBox; import javax.swing.JFileChooser; import javax.swing.JLabel; import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JSpinner; -import javax.swing.JTextArea; +import javax.swing.JSlider; import javax.swing.JTextField; import javax.swing.SpinnerModel; import javax.swing.SpinnerNumberModel; @@ -37,43 +42,59 @@ import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import net.miginfocom.swing.MigLayout; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - +import alias.action.AliasAction; import alias.action.RecurringAction.Interval; +import alias.action.clip.ClipActionEditor; -public class ScriptActionEditor extends JPanel implements ActionListener +public class ScriptActionEditor extends DocumentListenerEditor { private static final long serialVersionUID = 1L; - private final static Logger mLog = - LoggerFactory.getLogger( ScriptActionEditor.class ); - - private ScriptActionNode mScriptActionNode; + private static final String PLEASE_SELECT_A_FILE = "Please select a file"; + private static final String HELP_TEXT = + "

Script Action

" + + "This action will run a script according to the interval
" + + "that you select:

" + + "Once: run the first time the alias is active and
" + + "never again

" + + "Once, Reset After Delay: run once and suppress
" + + "subsequent runs for the specified period in seconds.
" + + "After the reset period, run again when the alias is active.

" + + "Until Dismissed: run every period seconds until you
" + + "click OK on the dialog that appears. Alerting is suppressed
" + + "for 15 seconds after you click OK.
" + + ""; + private JComboBox mComboInterval; - private JSpinner mSpinnerPeriod; + private JSlider mPeriodSlider; + private JLabel mPeriodSliderLabel; private JTextField mTextFilePath; - public ScriptActionEditor( ScriptActionNode clipActionNode ) + public ScriptActionEditor( AliasAction aliasAction ) { - mScriptActionNode = clipActionNode; - - initGUI(); + init(); + + setItem( aliasAction ); } - private void initGUI() + public ScriptAction getScriptAction() { - setLayout( new MigLayout( "fill,wrap 2", "[right][left]", "[][][][][][grow]" ) ); - - add( new JLabel( "Action: Script" ), "span,align center" ); + if( getItem() instanceof ScriptAction ) + { + 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.values() ); - - mComboInterval.setSelectedItem( mScriptActionNode.getScriptAction().getInterval() ); - + mComboInterval.setToolTipText( HELP_TEXT ); mComboInterval.addActionListener( new ActionListener() { @Override @@ -84,37 +105,51 @@ public class ScriptActionEditor extends JPanel implements ActionListener if( selected != null ) { - /* Enable/disable period spinner based on selection */ - mSpinnerPeriod.setEnabled( selected != Interval.ONCE ); + /* Enable/disable period slider based on selection */ + boolean enabled = selected != Interval.ONCE; - mScriptActionNode.getScriptAction().setInterval( selected ); + mPeriodSlider.setEnabled( enabled ); + mPeriodSliderLabel.setEnabled( enabled ); } + + setModified( true ); } }); - - add( mComboInterval, "wrap" ); + add( mComboInterval ); - final SpinnerModel model = new SpinnerNumberModel( - mScriptActionNode.getScriptAction().getPeriod(), 1, 30, 1 ); - + final SpinnerModel model = new SpinnerNumberModel( 1, 1, 30, 1 ); model.addChangeListener( new ChangeListener() { @Override public void stateChanged( ChangeEvent e ) { - mScriptActionNode.getScriptAction().setPeriod( (int)model.getValue() ); + setModified( true ); } } ); - mSpinnerPeriod = new JSpinner( model ); - - if( mScriptActionNode.getScriptAction().getInterval() == Interval.ONCE ) + mPeriodSlider = new JSlider( JSlider.HORIZONTAL, 1, 60, 1 ); + mPeriodSlider.setMajorTickSpacing( 10 ); + 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:" ) ); - add( mSpinnerPeriod, "wrap" ); + mPeriodSliderLabel = new JLabel( "Period: " + mPeriodSlider.getValue() + " " ); + add( mPeriodSliderLabel ); + add( mPeriodSlider, "wrap,grow" ); + + mTextFilePath = new JTextField( PLEASE_SELECT_A_FILE ); + add( mTextFilePath, "growx,span" ); JButton fileButton = new JButton( "File" ); @@ -131,13 +166,14 @@ public class ScriptActionEditor extends JPanel implements ActionListener { File file = chooser.getSelectedFile(); - mScriptActionNode.getScriptAction().setScript( file.getAbsolutePath() ); mTextFilePath.setText( file.getAbsolutePath() ); + + setModified( true ); } } } ); - add( fileButton ); + add( fileButton, "grow" ); JButton testButton = new JButton( "Test" ); testButton.addActionListener( new ActionListener() @@ -145,74 +181,115 @@ public class ScriptActionEditor extends JPanel implements ActionListener @Override public void actionPerformed( ActionEvent actionEvent ) { - String script = mScriptActionNode.getScriptAction().getScript(); + String script = mTextFilePath.getText(); if( script == null || script.trim().isEmpty() ) { JOptionPane.showMessageDialog( ScriptActionEditor.this, - "Please select a script file", "Please select file", + "Please select a script file", PLEASE_SELECT_A_FILE, JOptionPane.ERROR_MESSAGE ); } - - EventQueue.invokeLater( new Runnable() + else { - @Override - public void run() + if( isModified() ) { - 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(); - } - catch( Exception e ) - { - JOptionPane.showMessageDialog( ScriptActionEditor.this, - "Couldn't run script [" + e.getMessage() + "]", - "Error", JOptionPane.ERROR_MESSAGE ); + save(); } } - } ); + + 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() ); - add( mTextFilePath, "growx,span" ); + 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( 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(); - - sb.append( "This action will run the script according to the interval that you select.\n\n" ); - 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" ); + Interval interval = script.getInterval(); + + mComboInterval.setSelectedItem( interval ); - JButton btnReset = new JButton( "Reset" ); - btnReset.addActionListener( ScriptActionEditor.this ); - add( btnReset, "growx,push" ); + boolean enabled = interval != Interval.ONCE; + + 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 - public void actionPerformed( ActionEvent e ) - { - String command = e.getActionCommand(); - - if( command.contentEquals( "Save" ) ) + public void save() + { + if( hasItem() && isModified() ) { - mScriptActionNode.save(); - mScriptActionNode.show(); + ScriptAction script = getScriptAction(); + + script.setInterval( (Interval)mComboInterval.getSelectedItem() ); + script.setPeriod( mPeriodSlider.getValue() ); + script.setScript( mTextFilePath.getText() ); } - mScriptActionNode.refresh(); - } + setModified( false ); + } } diff --git a/src/alias/action/script/ScriptActionNode.java b/src/alias/action/script/ScriptActionNode.java index cbe25b45..74d20a44 100644 --- a/src/alias/action/script/ScriptActionNode.java +++ b/src/alias/action/script/ScriptActionNode.java @@ -41,7 +41,7 @@ public class ScriptActionNode extends AliasActionNode @Override public JPanel getEditor() { - return new ScriptActionEditor( this ); + return null; } public ScriptAction getScriptAction() diff --git a/src/alias/AliasID.java b/src/alias/id/AliasID.java similarity index 98% rename from src/alias/AliasID.java rename to src/alias/id/AliasID.java index a4a8ec7f..63497c91 100644 --- a/src/alias/AliasID.java +++ b/src/alias/id/AliasID.java @@ -15,11 +15,12 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see ******************************************************************************/ -package alias; +package alias.id; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlSeeAlso; +import alias.Group; import alias.id.esn.Esn; import alias.id.fleetsync.FleetsyncID; import alias.id.lojack.LoJackFunctionAndID; diff --git a/src/alias/AliasIDNode.java b/src/alias/id/AliasIDNode.java similarity index 98% rename from src/alias/AliasIDNode.java rename to src/alias/id/AliasIDNode.java index 3852b44d..adaf3b36 100644 --- a/src/alias/AliasIDNode.java +++ b/src/alias/id/AliasIDNode.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see ******************************************************************************/ -package alias; +package alias.id; import playlist.PlaylistManager; import controller.ConfigurableNode; diff --git a/src/alias/AliasIDType.java b/src/alias/id/AliasIDType.java similarity index 86% rename from src/alias/AliasIDType.java rename to src/alias/id/AliasIDType.java index a56d5b87..7417b66a 100644 --- a/src/alias/AliasIDType.java +++ b/src/alias/id/AliasIDType.java @@ -1,6 +1,6 @@ /******************************************************************************* * 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 * 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 * along with this program. If not, see ******************************************************************************/ -package alias; +package alias.id; public enum AliasIDType { @@ -26,11 +26,14 @@ public enum AliasIDType MDC1200( "MDC-1200" ), MIN( "Passport MIN" ), MPT1327( "MPT-1327" ), - NonRecordable( "Non-Recordable" ), - Priority( "Audio Priority" ), Site( "Site" ), Status( "Status" ), - Talkgroup( "Talkgroup" ); + Talkgroup( "Talkgroup" ), + + Invert( "Audio Inversion" ), + Priority( "Audio Priority" ), + NonRecordable( "Audio Non-Recordable" ), + Streaming( "Audio Streaming" ); private String mLabel; diff --git a/src/alias/AliasIdentifierEditor.java b/src/alias/id/AliasIdentifierEditor.java similarity index 76% rename from src/alias/AliasIdentifierEditor.java rename to src/alias/id/AliasIdentifierEditor.java index 3a8fca14..f2b89a48 100644 --- a/src/alias/AliasIdentifierEditor.java +++ b/src/alias/id/AliasIdentifierEditor.java @@ -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 + ******************************************************************************/ +package alias.id; + +import gui.editor.Editor; +import gui.editor.EmptyEditor; import java.awt.EventQueue; import java.awt.event.ActionEvent; @@ -27,9 +47,13 @@ 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 AliasIdentifierEditor extends AliasConfigurationEditor +public class AliasIdentifierEditor extends Editor { private static final long serialVersionUID = 1L; @@ -40,10 +64,8 @@ public class AliasIdentifierEditor extends AliasConfigurationEditor private JButton mNewIDButton; private JButton mCloneIDButton; private JButton mDeleteIDButton; - private EditorContainer mEditorContainer = new EditorContainer(); - private Alias mAlias; private AliasModel mAliasModel; public AliasIdentifierEditor( AliasModel model ) @@ -57,7 +79,7 @@ public class AliasIdentifierEditor extends AliasConfigurationEditor setLayout( new MigLayout( "fill,wrap 3", "[grow,fill][grow,fill][grow,fill]", "[][grow,fill][]" ) ); - mAliasIDList.setVisibleRowCount( 4 ); + mAliasIDList.setVisibleRowCount( 6 ); mAliasIDList.setSelectionMode( ListSelectionModel.SINGLE_SELECTION ); mAliasIDList.setLayoutOrientation( JList.VERTICAL ); mAliasIDList.addListSelectionListener( new ListSelectionListener() @@ -95,7 +117,7 @@ public class AliasIdentifierEditor extends AliasConfigurationEditor add( mEditorContainer, "span,grow" ); mNewIDButton = new JButton( "New ..." ); - + mNewIDButton.setToolTipText( "Create a new Alias Identifier" ); mNewIDButton.addMouseListener( new MouseAdapter() { @Override @@ -115,7 +137,6 @@ public class AliasIdentifierEditor extends AliasConfigurationEditor menu.add( new AddAliasIdentifierItem( AliasIDType.Talkgroup ) ); menu.addSeparator(); menu.add( new AddAliasIdentifierItem( AliasIDType.Priority ) ); - menu.addSeparator(); menu.add( new AddAliasIdentifierItem( AliasIDType.NonRecordable ) ); menu.show( e.getComponent(), e.getX(), e.getY() ); @@ -125,6 +146,7 @@ public class AliasIdentifierEditor extends AliasConfigurationEditor add( mNewIDButton ); mCloneIDButton = new JButton( "Clone" ); + mCloneIDButton.setToolTipText( "Create a copy of the currently selected identifier" ); mCloneIDButton.setEnabled( false ); mCloneIDButton.addActionListener( new ActionListener() { @@ -147,6 +169,7 @@ public class AliasIdentifierEditor extends AliasConfigurationEditor add( mCloneIDButton ); mDeleteIDButton = new JButton( "Delete" ); + mDeleteIDButton.setToolTipText( "Delete the currently selected identifier" ); mDeleteIDButton.setEnabled( false ); mDeleteIDButton.addActionListener( new ActionListener() { @@ -161,13 +184,15 @@ public class AliasIdentifierEditor extends AliasConfigurationEditor "Do you want to delete [" + selected.toString() + "]", "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 - 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 ); } @@ -188,7 +213,7 @@ public class AliasIdentifierEditor extends AliasConfigurationEditor { DefaultListModel model = new DefaultListModel(); - List ids = mAlias.getId(); + List ids = alias.getId(); Collections.sort( ids, new Comparator() { @@ -216,16 +241,19 @@ public class AliasIdentifierEditor extends AliasConfigurationEditor if( mEditorContainer.isModified() ) { mEditorContainer.save(); + + if( hasItem() ) + { + mAliasModel.broadcast( new AliasEvent( getItem(), Event.CHANGE ) ); + } } - - mAliasModel.broadcast( new AliasEvent( mAlias, Event.CHANGE ) ); } public class EditorContainer extends JPanel { private static final long serialVersionUID = 1L; - private ComponentEditor mEditor = new EmptyAliasIDEditor(); + private Editor mEditor = new EmptyEditor<>(); public EditorContainer() { @@ -273,6 +301,7 @@ public class AliasIdentifierEditor extends AliasConfigurationEditor } removeAll(); + //This will always give us an editor mEditor = AliasFactory.getEditor( aliasID ); add( mEditor ); @@ -283,16 +312,18 @@ public class AliasIdentifierEditor extends AliasConfigurationEditor 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() { @Override public void run() { - setAlias( mAlias ); + setItem( alias ); mAliasIDList.setSelectedValue( id, true ); } diff --git a/src/alias/id/esn/ESNEditor.java b/src/alias/id/esn/ESNEditor.java index 2aa59876..5973c291 100644 --- a/src/alias/id/esn/ESNEditor.java +++ b/src/alias/id/esn/ESNEditor.java @@ -17,6 +17,8 @@ ******************************************************************************/ package alias.id.esn; +import gui.editor.DocumentListenerEditor; + import java.awt.Color; import java.awt.Cursor; import java.awt.event.MouseAdapter; @@ -24,15 +26,12 @@ import java.awt.event.MouseEvent; import javax.swing.JLabel; import javax.swing.JOptionPane; -import javax.swing.JTextArea; import javax.swing.JTextField; import net.miginfocom.swing.MigLayout; -import alias.AliasID; -import alias.ComponentEditor; -import alias.id.talkgroup.TalkgroupIDEditor; +import alias.id.AliasID; -public class ESNEditor extends ComponentEditor +public class ESNEditor extends DocumentListenerEditor { private static final long serialVersionUID = 1L; @@ -47,11 +46,9 @@ public class ESNEditor extends ComponentEditor public ESNEditor( AliasID aliasID ) { - super( aliasID ); - initGUI(); - setComponent( aliasID ); + setItem( aliasID ); } private void initGUI() @@ -81,18 +78,18 @@ public class ESNEditor extends ComponentEditor public Esn getEsn() { - if( getComponent() instanceof Esn ) + if( getItem() instanceof Esn ) { - return (Esn)getComponent(); + return (Esn)getItem(); } return null; } @Override - public void setComponent( AliasID aliasID ) + public void setItem( AliasID aliasID ) { - mComponent = aliasID; + super.setItem( aliasID ); Esn esn = getEsn(); diff --git a/src/alias/id/esn/ESNNode.java b/src/alias/id/esn/ESNNode.java index a814811e..b75dc306 100644 --- a/src/alias/id/esn/ESNNode.java +++ b/src/alias/id/esn/ESNNode.java @@ -26,8 +26,8 @@ import javax.swing.JPanel; import javax.swing.JPopupMenu; import playlist.PlaylistManager; -import alias.AliasIDNode; import alias.AliasNode; +import alias.id.AliasIDNode; public class ESNNode extends AliasIDNode { diff --git a/src/alias/id/esn/Esn.java b/src/alias/id/esn/Esn.java index 09198031..91d5396d 100644 --- a/src/alias/id/esn/Esn.java +++ b/src/alias/id/esn/Esn.java @@ -19,8 +19,8 @@ package alias.id.esn; import javax.xml.bind.annotation.XmlAttribute; -import alias.AliasID; -import alias.AliasIDType; +import alias.id.AliasID; +import alias.id.AliasIDType; public class Esn extends AliasID { diff --git a/src/alias/id/fleetsync/FleetsyncID.java b/src/alias/id/fleetsync/FleetsyncID.java index ca92a75c..57de648e 100644 --- a/src/alias/id/fleetsync/FleetsyncID.java +++ b/src/alias/id/fleetsync/FleetsyncID.java @@ -19,8 +19,8 @@ package alias.id.fleetsync; import javax.xml.bind.annotation.XmlAttribute; -import alias.AliasID; -import alias.AliasIDType; +import alias.id.AliasID; +import alias.id.AliasIDType; public class FleetsyncID extends AliasID diff --git a/src/alias/id/fleetsync/FleetsyncIDEditor.java b/src/alias/id/fleetsync/FleetsyncIDEditor.java index 8bb1bc06..b4dbc7ba 100644 --- a/src/alias/id/fleetsync/FleetsyncIDEditor.java +++ b/src/alias/id/fleetsync/FleetsyncIDEditor.java @@ -17,30 +17,27 @@ ******************************************************************************/ package alias.id.fleetsync; +import gui.editor.DocumentListenerEditor; + import java.awt.Color; import java.awt.Cursor; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JFormattedTextField; import javax.swing.JLabel; import javax.swing.JOptionPane; -import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.text.MaskFormatter; +import net.miginfocom.swing.MigLayout; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import controller.channel.Channel; -import net.miginfocom.swing.MigLayout; -import alias.AliasID; -import alias.ComponentEditor; -import alias.id.esn.ESNEditor; +import alias.id.AliasID; -public class FleetsyncIDEditor extends ComponentEditor +public class FleetsyncIDEditor extends DocumentListenerEditor { private final static Logger mLog = LoggerFactory.getLogger( FleetsyncIDEditor.class ); @@ -56,11 +53,9 @@ public class FleetsyncIDEditor extends ComponentEditor public FleetsyncIDEditor( AliasID aliasID ) { - super( aliasID ); - initGUI(); - setComponent( aliasID ); + setItem( aliasID ); } private void initGUI() @@ -104,18 +99,18 @@ public class FleetsyncIDEditor extends ComponentEditor public FleetsyncID getFleetsyncID() { - if( getComponent() instanceof FleetsyncID ) + if( getItem() instanceof FleetsyncID ) { - return (FleetsyncID)getComponent(); + return (FleetsyncID)getItem(); } return null; } @Override - public void setComponent( AliasID aliasID ) + public void setItem( AliasID aliasID ) { - mComponent = aliasID; + super.setItem( aliasID ); FleetsyncID fleetsync = getFleetsyncID(); diff --git a/src/alias/id/fleetsync/FleetsyncIDNode.java b/src/alias/id/fleetsync/FleetsyncIDNode.java index 280c44a8..aae77b47 100644 --- a/src/alias/id/fleetsync/FleetsyncIDNode.java +++ b/src/alias/id/fleetsync/FleetsyncIDNode.java @@ -26,8 +26,8 @@ import javax.swing.JPanel; import javax.swing.JPopupMenu; import playlist.PlaylistManager; -import alias.AliasIDNode; import alias.AliasNode; +import alias.id.AliasIDNode; public class FleetsyncIDNode extends AliasIDNode { diff --git a/src/alias/id/lojack/LoJackFunctionAndID.java b/src/alias/id/lojack/LoJackFunctionAndID.java index 99ee74b1..065db0f4 100644 --- a/src/alias/id/lojack/LoJackFunctionAndID.java +++ b/src/alias/id/lojack/LoJackFunctionAndID.java @@ -21,8 +21,8 @@ import javax.xml.bind.annotation.XmlAttribute; import module.decode.lj1200.LJ1200Message; import module.decode.lj1200.LJ1200Message.Function; -import alias.AliasID; -import alias.AliasIDType; +import alias.id.AliasID; +import alias.id.AliasIDType; public class LoJackFunctionAndID extends AliasID { diff --git a/src/alias/id/lojack/LoJackIDEditor.java b/src/alias/id/lojack/LoJackIDEditor.java index 6fcf9ad4..aa6ae805 100644 --- a/src/alias/id/lojack/LoJackIDEditor.java +++ b/src/alias/id/lojack/LoJackIDEditor.java @@ -17,6 +17,8 @@ ******************************************************************************/ package alias.id.lojack; +import gui.editor.DocumentListenerEditor; + import java.awt.Color; import java.awt.Cursor; import java.awt.event.ActionEvent; @@ -34,10 +36,9 @@ import javax.swing.text.MaskFormatter; import module.decode.lj1200.LJ1200Message; import module.decode.lj1200.LJ1200Message.Function; import net.miginfocom.swing.MigLayout; -import alias.AliasID; -import alias.ComponentEditor; +import alias.id.AliasID; -public class LoJackIDEditor extends ComponentEditor +public class LoJackIDEditor extends DocumentListenerEditor { private static final long serialVersionUID = 1L; @@ -61,11 +62,9 @@ public class LoJackIDEditor extends ComponentEditor public LoJackIDEditor( AliasID aliasID ) { - super( aliasID ); - initGUI(); - setComponent( aliasID ); + setItem( aliasID ); } private void initGUI() @@ -121,18 +120,18 @@ public class LoJackIDEditor extends ComponentEditor public LoJackFunctionAndID getLoJackID() { - if( getComponent() instanceof LoJackFunctionAndID ) + if( getItem() instanceof LoJackFunctionAndID ) { - return (LoJackFunctionAndID)getComponent(); + return (LoJackFunctionAndID)getItem(); } return null; } @Override - public void setComponent( AliasID aliasID ) + public void setItem( AliasID aliasID ) { - mComponent = aliasID; + super.setItem( aliasID ); LoJackFunctionAndID lojack = getLoJackID(); diff --git a/src/alias/id/lojack/LoJackIDNode.java b/src/alias/id/lojack/LoJackIDNode.java index b5e65b7f..76588b38 100644 --- a/src/alias/id/lojack/LoJackIDNode.java +++ b/src/alias/id/lojack/LoJackIDNode.java @@ -26,8 +26,8 @@ import javax.swing.JPanel; import javax.swing.JPopupMenu; import playlist.PlaylistManager; -import alias.AliasIDNode; import alias.AliasNode; +import alias.id.AliasIDNode; public class LoJackIDNode extends AliasIDNode { diff --git a/src/alias/id/mdc/MDC1200ID.java b/src/alias/id/mdc/MDC1200ID.java index cf866e35..af0ed12e 100644 --- a/src/alias/id/mdc/MDC1200ID.java +++ b/src/alias/id/mdc/MDC1200ID.java @@ -19,8 +19,8 @@ package alias.id.mdc; import javax.xml.bind.annotation.XmlAttribute; -import alias.AliasID; -import alias.AliasIDType; +import alias.id.AliasID; +import alias.id.AliasIDType; public class MDC1200ID extends AliasID diff --git a/src/alias/id/mdc/MDC1200IDEditor.java b/src/alias/id/mdc/MDC1200IDEditor.java index cae6ae6d..eb092e35 100644 --- a/src/alias/id/mdc/MDC1200IDEditor.java +++ b/src/alias/id/mdc/MDC1200IDEditor.java @@ -17,6 +17,8 @@ ******************************************************************************/ package alias.id.mdc; +import gui.editor.DocumentListenerEditor; + import java.awt.Color; import java.awt.Cursor; import java.awt.event.MouseAdapter; @@ -29,10 +31,9 @@ import javax.swing.JTextField; import javax.swing.text.MaskFormatter; import net.miginfocom.swing.MigLayout; -import alias.AliasID; -import alias.ComponentEditor; +import alias.id.AliasID; -public class MDC1200IDEditor extends ComponentEditor +public class MDC1200IDEditor extends DocumentListenerEditor { private static final long serialVersionUID = 1L; @@ -47,11 +48,9 @@ public class MDC1200IDEditor extends ComponentEditor public MDC1200IDEditor( AliasID aliasID ) { - super( aliasID ); - initGUI(); - setComponent( aliasID ); + setItem( aliasID ); } private void initGUI() @@ -94,18 +93,18 @@ public class MDC1200IDEditor extends ComponentEditor public MDC1200ID getMDC1200ID() { - if( getComponent() instanceof MDC1200ID ) + if( getItem() instanceof MDC1200ID ) { - return (MDC1200ID)getComponent(); + return (MDC1200ID)getItem(); } return null; } @Override - public void setComponent( AliasID aliasID ) + public void setItem( AliasID aliasID ) { - mComponent = aliasID; + super.setItem( aliasID ); MDC1200ID mdc = getMDC1200ID(); diff --git a/src/alias/id/mdc/MDC1200IDNode.java b/src/alias/id/mdc/MDC1200IDNode.java index 0af5fae0..06309d68 100644 --- a/src/alias/id/mdc/MDC1200IDNode.java +++ b/src/alias/id/mdc/MDC1200IDNode.java @@ -26,8 +26,8 @@ import javax.swing.JPanel; import javax.swing.JPopupMenu; import playlist.PlaylistManager; -import alias.AliasIDNode; import alias.AliasNode; +import alias.id.AliasIDNode; public class MDC1200IDNode extends AliasIDNode { diff --git a/src/alias/id/mobileID/MINEditor.java b/src/alias/id/mobileID/MINEditor.java index 972a6764..f873e70e 100644 --- a/src/alias/id/mobileID/MINEditor.java +++ b/src/alias/id/mobileID/MINEditor.java @@ -17,6 +17,8 @@ ******************************************************************************/ package alias.id.mobileID; +import gui.editor.DocumentListenerEditor; + import java.awt.Color; import java.awt.Cursor; import java.awt.event.MouseAdapter; @@ -25,16 +27,13 @@ import java.awt.event.MouseEvent; import javax.swing.JFormattedTextField; import javax.swing.JLabel; import javax.swing.JOptionPane; -import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.text.MaskFormatter; import net.miginfocom.swing.MigLayout; -import alias.AliasID; -import alias.ComponentEditor; -import alias.id.esn.ESNEditor; +import alias.id.AliasID; -public class MINEditor extends ComponentEditor +public class MINEditor extends DocumentListenerEditor { private static final long serialVersionUID = 1L; @@ -49,11 +48,9 @@ public class MINEditor extends ComponentEditor public MINEditor( AliasID aliasID ) { - super( aliasID ); - initGUI(); - setComponent( aliasID ); + setItem( aliasID ); } private void initGUI() @@ -96,18 +93,18 @@ public class MINEditor extends ComponentEditor public Min getMin() { - if( getComponent() instanceof Min ) + if( getItem() instanceof Min ) { - return (Min)getComponent(); + return (Min)getItem(); } return null; } @Override - public void setComponent( AliasID aliasID ) + public void setItem( AliasID aliasID ) { - mComponent = aliasID; + super.setItem( aliasID ); Min min = getMin(); diff --git a/src/alias/id/mobileID/MINNode.java b/src/alias/id/mobileID/MINNode.java index 3f43fca2..2c04c0e8 100644 --- a/src/alias/id/mobileID/MINNode.java +++ b/src/alias/id/mobileID/MINNode.java @@ -26,8 +26,8 @@ import javax.swing.JPanel; import javax.swing.JPopupMenu; import playlist.PlaylistManager; -import alias.AliasIDNode; import alias.AliasNode; +import alias.id.AliasIDNode; public class MINNode extends AliasIDNode { diff --git a/src/alias/id/mobileID/Min.java b/src/alias/id/mobileID/Min.java index ca6b02dd..c6f8e4c2 100644 --- a/src/alias/id/mobileID/Min.java +++ b/src/alias/id/mobileID/Min.java @@ -19,8 +19,8 @@ package alias.id.mobileID; import javax.xml.bind.annotation.XmlAttribute; -import alias.AliasID; -import alias.AliasIDType; +import alias.id.AliasID; +import alias.id.AliasIDType; /** * Mobile ID Number diff --git a/src/alias/id/mpt1327/MPT1327ID.java b/src/alias/id/mpt1327/MPT1327ID.java index 5aa4c463..57535dbb 100644 --- a/src/alias/id/mpt1327/MPT1327ID.java +++ b/src/alias/id/mpt1327/MPT1327ID.java @@ -19,8 +19,8 @@ package alias.id.mpt1327; import javax.xml.bind.annotation.XmlAttribute; -import alias.AliasID; -import alias.AliasIDType; +import alias.id.AliasID; +import alias.id.AliasIDType; public class MPT1327ID extends AliasID { diff --git a/src/alias/id/mpt1327/MPT1327IDEditor.java b/src/alias/id/mpt1327/MPT1327IDEditor.java index a46709b8..1e9283c8 100644 --- a/src/alias/id/mpt1327/MPT1327IDEditor.java +++ b/src/alias/id/mpt1327/MPT1327IDEditor.java @@ -17,6 +17,8 @@ ******************************************************************************/ package alias.id.mpt1327; +import gui.editor.DocumentListenerEditor; + import java.awt.Color; import java.awt.Cursor; import java.awt.event.MouseAdapter; @@ -29,10 +31,9 @@ import javax.swing.JTextField; import javax.swing.text.MaskFormatter; import net.miginfocom.swing.MigLayout; -import alias.AliasID; -import alias.ComponentEditor; +import alias.id.AliasID; -public class MPT1327IDEditor extends ComponentEditor +public class MPT1327IDEditor extends DocumentListenerEditor { private static final long serialVersionUID = 1L; @@ -48,11 +49,9 @@ public class MPT1327IDEditor extends ComponentEditor public MPT1327IDEditor( AliasID aliasID ) { - super( aliasID ); - initGUI(); - setComponent( aliasID ); + setItem( aliasID ); } private void initGUI() @@ -96,18 +95,18 @@ public class MPT1327IDEditor extends ComponentEditor public MPT1327ID getMPT1327ID() { - if( getComponent() instanceof MPT1327ID ) + if( getItem() instanceof MPT1327ID ) { - return (MPT1327ID)getComponent(); + return (MPT1327ID)getItem(); } return null; } @Override - public void setComponent( AliasID aliasID ) + public void setItem( AliasID aliasID ) { - mComponent = aliasID; + super.setItem( aliasID ); MPT1327ID mpt = getMPT1327ID(); diff --git a/src/alias/id/mpt1327/MPT1327IDNode.java b/src/alias/id/mpt1327/MPT1327IDNode.java index 04cda43a..da648bfe 100644 --- a/src/alias/id/mpt1327/MPT1327IDNode.java +++ b/src/alias/id/mpt1327/MPT1327IDNode.java @@ -26,8 +26,8 @@ import javax.swing.JPanel; import javax.swing.JPopupMenu; import playlist.PlaylistManager; -import alias.AliasIDNode; import alias.AliasNode; +import alias.id.AliasIDNode; public class MPT1327IDNode extends AliasIDNode { diff --git a/src/alias/id/nonrecordable/NonRecordable.java b/src/alias/id/nonrecordable/NonRecordable.java index 423ccd56..97128880 100644 --- a/src/alias/id/nonrecordable/NonRecordable.java +++ b/src/alias/id/nonrecordable/NonRecordable.java @@ -1,7 +1,7 @@ package alias.id.nonrecordable; -import alias.AliasID; -import alias.AliasIDType; +import alias.id.AliasID; +import alias.id.AliasIDType; public class NonRecordable extends AliasID { @@ -20,6 +20,6 @@ public class NonRecordable extends AliasID @Override public String toString() { - return "Non-Recordable"; + return "Audio Non-Recordable"; } } diff --git a/src/alias/id/nonrecordable/NonRecordableEditor.java b/src/alias/id/nonrecordable/NonRecordableEditor.java index 54aab852..35578a51 100644 --- a/src/alias/id/nonrecordable/NonRecordableEditor.java +++ b/src/alias/id/nonrecordable/NonRecordableEditor.java @@ -17,6 +17,8 @@ ******************************************************************************/ package alias.id.nonrecordable; +import gui.editor.DocumentListenerEditor; + import java.awt.Color; import java.awt.Cursor; import java.awt.event.MouseAdapter; @@ -26,26 +28,23 @@ import javax.swing.JLabel; import javax.swing.JOptionPane; import net.miginfocom.swing.MigLayout; -import alias.AliasID; -import alias.ComponentEditor; +import alias.id.AliasID; -public class NonRecordableEditor extends ComponentEditor +public class NonRecordableEditor extends DocumentListenerEditor { private static final long serialVersionUID = 1L; private static final String HELP_TEXT = "" - + "

Non-Recordable Example

" + + "

Audio Non-Recordable Example

" + "This identifies an alias as non-recordable.

" - + "The alias can still be monitored but it will not be recorded
" + + "The alias can still be monitored but associated audio will not be recorded
" + "when recording is enabled for the decoding channel."; public NonRecordableEditor( AliasID aliasID ) { - super( aliasID ); - initGUI(); - setComponent( aliasID ); + setItem( aliasID ); } private void initGUI() @@ -63,17 +62,12 @@ public class NonRecordableEditor extends ComponentEditor public void mouseClicked( MouseEvent e ) { JOptionPane.showMessageDialog( NonRecordableEditor.this, - HELP_TEXT, "Examples", JOptionPane.INFORMATION_MESSAGE ); + HELP_TEXT, "Example", JOptionPane.INFORMATION_MESSAGE ); } } ); add( example ); } - @Override - public void setComponent( AliasID aliasID ) - { - } - @Override public void save() { diff --git a/src/alias/id/nonrecordable/NonRecordableNode.java b/src/alias/id/nonrecordable/NonRecordableNode.java index 2a9a2fa4..81f756bb 100644 --- a/src/alias/id/nonrecordable/NonRecordableNode.java +++ b/src/alias/id/nonrecordable/NonRecordableNode.java @@ -26,9 +26,9 @@ import javax.swing.JPanel; import javax.swing.JPopupMenu; import playlist.PlaylistManager; -import alias.AliasID; -import alias.AliasIDNode; import alias.AliasNode; +import alias.id.AliasID; +import alias.id.AliasIDNode; public class NonRecordableNode extends AliasIDNode { diff --git a/src/alias/id/priority/Priority.java b/src/alias/id/priority/Priority.java index d15a75f0..e29be8a0 100644 --- a/src/alias/id/priority/Priority.java +++ b/src/alias/id/priority/Priority.java @@ -19,8 +19,8 @@ package alias.id.priority; import javax.xml.bind.annotation.XmlAttribute; -import alias.AliasID; -import alias.AliasIDType; +import alias.id.AliasID; +import alias.id.AliasIDType; /** * Specifies an (audio) priority level for this alias. @@ -60,7 +60,7 @@ public class Priority extends AliasID public String toString() { - return "Priority: " + ( isDoNotMonitor() ? "Do Not Monitor" : mPriority ); + return "Audio Priority: " + ( isDoNotMonitor() ? "Do Not Monitor" : mPriority ); } @Override diff --git a/src/alias/id/priority/PriorityEditor.java b/src/alias/id/priority/PriorityEditor.java index 1190d2ec..db3868e2 100644 --- a/src/alias/id/priority/PriorityEditor.java +++ b/src/alias/id/priority/PriorityEditor.java @@ -17,6 +17,8 @@ ******************************************************************************/ package alias.id.priority; +import gui.editor.DocumentListenerEditor; + import java.awt.Color; import java.awt.Cursor; import java.awt.event.ActionEvent; @@ -32,17 +34,16 @@ import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import net.miginfocom.swing.MigLayout; -import alias.AliasID; -import alias.ComponentEditor; +import alias.id.AliasID; -public class PriorityEditor extends ComponentEditor +public class PriorityEditor extends DocumentListenerEditor { private static final long serialVersionUID = 1L; public static final String DO_NOT_MONITOR = "Do Not Monitor"; private static final String HELP_TEXT = "" - + "

Call Priority Example

" + + "

Call Audio Priority Example

" + "Priority determines which calls have priority for playback
" + "over your computer speakers, or designates an alias for
" + "no-monitoring if you don't want to hear calls from an alias.

" @@ -55,11 +56,9 @@ public class PriorityEditor extends ComponentEditor public PriorityEditor( AliasID aliasID ) { - super( aliasID ); - initGUI(); - setComponent( aliasID ); + setItem( aliasID ); } private void initGUI() @@ -119,18 +118,18 @@ public class PriorityEditor extends ComponentEditor public Priority getPriority() { - if( getComponent() instanceof Priority ) + if( getItem() instanceof Priority ) { - return (Priority)getComponent(); + return (Priority)getItem(); } return null; } @Override - public void setComponent( AliasID aliasID ) + public void setItem( AliasID aliasID ) { - mComponent = aliasID; + super.setItem( aliasID ); Priority priority = getPriority(); diff --git a/src/alias/id/priority/PriorityNode.java b/src/alias/id/priority/PriorityNode.java index 2a448d48..52b94cec 100644 --- a/src/alias/id/priority/PriorityNode.java +++ b/src/alias/id/priority/PriorityNode.java @@ -26,8 +26,8 @@ import javax.swing.JPanel; import javax.swing.JPopupMenu; import playlist.PlaylistManager; -import alias.AliasIDNode; import alias.AliasNode; +import alias.id.AliasIDNode; public class PriorityNode extends AliasIDNode { diff --git a/src/alias/id/siteID/SiteID.java b/src/alias/id/siteID/SiteID.java index ba5f57e0..a36d2fd5 100644 --- a/src/alias/id/siteID/SiteID.java +++ b/src/alias/id/siteID/SiteID.java @@ -19,8 +19,8 @@ package alias.id.siteID; import javax.xml.bind.annotation.XmlAttribute; -import alias.AliasID; -import alias.AliasIDType; +import alias.id.AliasID; +import alias.id.AliasIDType; public class SiteID extends AliasID { diff --git a/src/alias/id/siteID/SiteIDEditor.java b/src/alias/id/siteID/SiteIDEditor.java index 4850422a..b9a1367a 100644 --- a/src/alias/id/siteID/SiteIDEditor.java +++ b/src/alias/id/siteID/SiteIDEditor.java @@ -17,6 +17,8 @@ ******************************************************************************/ package alias.id.siteID; +import gui.editor.DocumentListenerEditor; + import java.awt.Color; import java.awt.Cursor; import java.awt.event.MouseAdapter; @@ -27,10 +29,9 @@ import javax.swing.JOptionPane; import javax.swing.JTextField; import net.miginfocom.swing.MigLayout; -import alias.AliasID; -import alias.ComponentEditor; +import alias.id.AliasID; -public class SiteIDEditor extends ComponentEditor +public class SiteIDEditor extends DocumentListenerEditor { private static final long serialVersionUID = 1L; @@ -47,11 +48,9 @@ public class SiteIDEditor extends ComponentEditor public SiteIDEditor( AliasID aliasID ) { - super( aliasID ); - initGUI(); - setComponent( aliasID ); + setItem( aliasID ); } private void initGUI() @@ -82,18 +81,18 @@ public class SiteIDEditor extends ComponentEditor public SiteID getSiteID() { - if( getComponent() instanceof SiteID ) + if( getItem() instanceof SiteID ) { - return (SiteID)getComponent(); + return (SiteID)getItem(); } return null; } @Override - public void setComponent( AliasID aliasID ) + public void setItem( AliasID aliasID ) { - mComponent = aliasID; + super.setItem( aliasID ); SiteID siteID = getSiteID(); diff --git a/src/alias/id/siteID/SiteIDNode.java b/src/alias/id/siteID/SiteIDNode.java index 52cc308b..a234584c 100644 --- a/src/alias/id/siteID/SiteIDNode.java +++ b/src/alias/id/siteID/SiteIDNode.java @@ -26,8 +26,8 @@ import javax.swing.JPanel; import javax.swing.JPopupMenu; import playlist.PlaylistManager; -import alias.AliasIDNode; import alias.AliasNode; +import alias.id.AliasIDNode; public class SiteIDNode extends AliasIDNode { diff --git a/src/alias/id/status/StatusID.java b/src/alias/id/status/StatusID.java index 5ce9c2ab..b93e0ad8 100644 --- a/src/alias/id/status/StatusID.java +++ b/src/alias/id/status/StatusID.java @@ -19,8 +19,8 @@ package alias.id.status; import javax.xml.bind.annotation.XmlAttribute; -import alias.AliasID; -import alias.AliasIDType; +import alias.id.AliasID; +import alias.id.AliasIDType; public class StatusID extends AliasID { diff --git a/src/alias/id/status/StatusIDEditor.java b/src/alias/id/status/StatusIDEditor.java index 6b29e174..e97dd0eb 100644 --- a/src/alias/id/status/StatusIDEditor.java +++ b/src/alias/id/status/StatusIDEditor.java @@ -17,6 +17,8 @@ ******************************************************************************/ package alias.id.status; +import gui.editor.DocumentListenerEditor; + import java.awt.Color; import java.awt.Cursor; import java.awt.event.MouseAdapter; @@ -29,10 +31,9 @@ import javax.swing.JTextField; import javax.swing.text.MaskFormatter; import net.miginfocom.swing.MigLayout; -import alias.AliasID; -import alias.ComponentEditor; +import alias.id.AliasID; -public class StatusIDEditor extends ComponentEditor +public class StatusIDEditor extends DocumentListenerEditor { private static final long serialVersionUID = 1L; @@ -49,11 +50,9 @@ public class StatusIDEditor extends ComponentEditor public StatusIDEditor( AliasID aliasID ) { - super( aliasID ); - initGUI(); - setComponent( aliasID ); + setItem( aliasID ); } private void initGUI() @@ -96,18 +95,18 @@ public class StatusIDEditor extends ComponentEditor public StatusID getStatusID() { - if( getComponent() instanceof StatusID ) + if( getItem() instanceof StatusID ) { - return (StatusID)getComponent(); + return (StatusID)getItem(); } return null; } @Override - public void setComponent( AliasID aliasID ) + public void setItem( AliasID aliasID ) { - mComponent = aliasID; + super.setItem( aliasID ); StatusID statusID = getStatusID(); diff --git a/src/alias/id/status/StatusIDNode.java b/src/alias/id/status/StatusIDNode.java index 19586a5f..2c20df17 100644 --- a/src/alias/id/status/StatusIDNode.java +++ b/src/alias/id/status/StatusIDNode.java @@ -26,8 +26,8 @@ import javax.swing.JPanel; import javax.swing.JPopupMenu; import playlist.PlaylistManager; -import alias.AliasIDNode; import alias.AliasNode; +import alias.id.AliasIDNode; public class StatusIDNode extends AliasIDNode { diff --git a/src/alias/id/talkgroup/TalkgroupID.java b/src/alias/id/talkgroup/TalkgroupID.java index 2d8da48c..6fea85d8 100644 --- a/src/alias/id/talkgroup/TalkgroupID.java +++ b/src/alias/id/talkgroup/TalkgroupID.java @@ -19,8 +19,8 @@ package alias.id.talkgroup; import javax.xml.bind.annotation.XmlAttribute; -import alias.AliasID; -import alias.AliasIDType; +import alias.id.AliasID; +import alias.id.AliasIDType; import audio.inverted.AudioType; diff --git a/src/alias/id/talkgroup/TalkgroupIDEditor.java b/src/alias/id/talkgroup/TalkgroupIDEditor.java index 981a00c7..f7ab1a96 100644 --- a/src/alias/id/talkgroup/TalkgroupIDEditor.java +++ b/src/alias/id/talkgroup/TalkgroupIDEditor.java @@ -17,6 +17,8 @@ ******************************************************************************/ package alias.id.talkgroup; +import gui.editor.DocumentListenerEditor; + import java.awt.Color; import java.awt.Cursor; import java.awt.event.MouseAdapter; @@ -27,10 +29,9 @@ import javax.swing.JOptionPane; import javax.swing.JTextField; import net.miginfocom.swing.MigLayout; -import alias.AliasID; -import alias.ComponentEditor; +import alias.id.AliasID; -public class TalkgroupIDEditor extends ComponentEditor +public class TalkgroupIDEditor extends DocumentListenerEditor { private static final long serialVersionUID = 1L; @@ -47,11 +48,9 @@ public class TalkgroupIDEditor extends ComponentEditor public TalkgroupIDEditor( AliasID aliasID ) { - super( aliasID ); - initGUI(); - setComponent( aliasID ); + setItem( aliasID ); } private void initGUI() @@ -82,18 +81,18 @@ public class TalkgroupIDEditor extends ComponentEditor public TalkgroupID getTalkgroupID() { - if( getComponent() instanceof TalkgroupID ) + if( getItem() instanceof TalkgroupID ) { - return (TalkgroupID)getComponent(); + return (TalkgroupID)getItem(); } return null; } @Override - public void setComponent( AliasID aliasID ) + public void setItem( AliasID aliasID ) { - mComponent = aliasID; + super.setItem( aliasID ); TalkgroupID talkgroup = getTalkgroupID(); diff --git a/src/alias/id/talkgroup/TalkgroupIDNode.java b/src/alias/id/talkgroup/TalkgroupIDNode.java index 1a11cd08..a58ffb05 100644 --- a/src/alias/id/talkgroup/TalkgroupIDNode.java +++ b/src/alias/id/talkgroup/TalkgroupIDNode.java @@ -26,8 +26,8 @@ import javax.swing.JPanel; import javax.swing.JPopupMenu; import playlist.PlaylistManager; -import alias.AliasIDNode; import alias.AliasNode; +import alias.id.AliasIDNode; public class TalkgroupIDNode extends AliasIDNode { diff --git a/src/alias/id/uniqueID/UniqueID.java b/src/alias/id/uniqueID/UniqueID.java index f6596294..ab7aedd0 100644 --- a/src/alias/id/uniqueID/UniqueID.java +++ b/src/alias/id/uniqueID/UniqueID.java @@ -19,8 +19,8 @@ package alias.id.uniqueID; import javax.xml.bind.annotation.XmlAttribute; -import alias.AliasID; -import alias.AliasIDType; +import alias.id.AliasID; +import alias.id.AliasIDType; public class UniqueID extends AliasID { diff --git a/src/alias/id/uniqueID/UniqueIDEditor.java b/src/alias/id/uniqueID/UniqueIDEditor.java index 7a90c6aa..8042c54d 100644 --- a/src/alias/id/uniqueID/UniqueIDEditor.java +++ b/src/alias/id/uniqueID/UniqueIDEditor.java @@ -17,6 +17,8 @@ ******************************************************************************/ package alias.id.uniqueID; +import gui.editor.DocumentListenerEditor; + import java.awt.Color; import java.awt.Cursor; import java.awt.event.MouseAdapter; @@ -27,10 +29,9 @@ import javax.swing.JOptionPane; import javax.swing.JTextField; import net.miginfocom.swing.MigLayout; -import alias.AliasID; -import alias.ComponentEditor; +import alias.id.AliasID; -public class UniqueIDEditor extends ComponentEditor +public class UniqueIDEditor extends DocumentListenerEditor { private static final long serialVersionUID = 1L; @@ -44,11 +45,9 @@ public class UniqueIDEditor extends ComponentEditor public UniqueIDEditor( AliasID aliasID ) { - super( aliasID ); - initGUI(); - setComponent( aliasID ); + setItem( aliasID ); } private void initGUI() @@ -78,18 +77,18 @@ public class UniqueIDEditor extends ComponentEditor public UniqueID getUniqueID() { - if( getComponent() instanceof UniqueID ) + if( getItem() instanceof UniqueID ) { - return (UniqueID)getComponent(); + return (UniqueID)getItem(); } return null; } @Override - public void setComponent( AliasID aliasID ) + public void setItem( AliasID aliasID ) { - mComponent = aliasID; + super.setItem( aliasID ); UniqueID uid = getUniqueID(); diff --git a/src/alias/id/uniqueID/UniqueIDNode.java b/src/alias/id/uniqueID/UniqueIDNode.java index bdf43be9..430ecdbd 100644 --- a/src/alias/id/uniqueID/UniqueIDNode.java +++ b/src/alias/id/uniqueID/UniqueIDNode.java @@ -26,8 +26,8 @@ import javax.swing.JPanel; import javax.swing.JPopupMenu; import playlist.PlaylistManager; -import alias.AliasIDNode; import alias.AliasNode; +import alias.id.AliasIDNode; public class UniqueIDNode extends AliasIDNode { diff --git a/src/gui/editor/DocumentListenerEditor.java b/src/gui/editor/DocumentListenerEditor.java new file mode 100644 index 00000000..2524de87 --- /dev/null +++ b/src/gui/editor/DocumentListenerEditor.java @@ -0,0 +1,29 @@ +package gui.editor; + +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; + +public abstract class DocumentListenerEditor extends Editor + 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 ) { } +} diff --git a/src/gui/editor/Editor.java b/src/gui/editor/Editor.java new file mode 100644 index 00000000..258cc3bc --- /dev/null +++ b/src/gui/editor/Editor.java @@ -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 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 ); + } +} diff --git a/src/gui/editor/EmptyEditor.java b/src/gui/editor/EmptyEditor.java new file mode 100644 index 00000000..4578df0b --- /dev/null +++ b/src/gui/editor/EmptyEditor.java @@ -0,0 +1,26 @@ +package gui.editor; + +import javax.swing.JLabel; + +import net.miginfocom.swing.MigLayout; + +public class EmptyEditor extends Editor +{ + 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() + { + } +} diff --git a/src/module/ProcessingChain.java b/src/module/ProcessingChain.java index 5652db05..271d1216 100644 --- a/src/module/ProcessingChain.java +++ b/src/module/ProcessingChain.java @@ -599,7 +599,6 @@ public class ProcessingChain implements IChannelEventListener */ public void addMessageListener( Listener listener ) { - mLog.debug( "Registering Message Listener:" + listener.getClass() ); mMessageBroadcaster.addListener( listener ); }