wip #34 - resolved various issues with alias controller and editors.

Added synchronized method to channel processing manager to ensure that
we don't have contention during channel changes.
This commit is contained in:
denny
2016-03-26 07:17:43 -04:00
parent 112083a22f
commit 58160d6c6b
6 changed files with 53 additions and 35 deletions

View File

@@ -9,6 +9,7 @@ import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.swing.ImageIcon;
@@ -177,8 +178,14 @@ public class AliasController extends JPanel
if( !event.getValueIsAdjusting() )
{
int[] selectedRows = mAliasTable.getSelectedRows();
if( selectedRows.length <= 1 )
if( selectedRows.length == 0 )
{
mAliasEditor.setItem( null );
mCopyButton.setEnabled( false );
mDeleteButton.setEnabled( false );
}
else if( selectedRows.length == 1 )
{
setEditor( mAliasEditor );
@@ -244,17 +251,26 @@ public class AliasController extends JPanel
}
}
private Alias getSelectedAlias()
private List<Alias> getSelectedAliases()
{
int index = mAliasTable.getSelectedRow();
List<Alias> selected = new ArrayList<>();
if( index >= 0 )
int[] rows = mAliasTable.getSelectedRows();
for( int row: rows )
{
return mAliasModel.getAliasAtIndex(
mAliasTable.convertRowIndexToModel( index ) );
if( row >= 0 )
{
Alias alias = mAliasModel.getAliasAtIndex( mAliasTable.convertRowIndexToModel( row ) );
if( alias != null )
{
selected.add( alias );
}
}
}
return null;
return selected;
}
/**
@@ -269,25 +285,29 @@ public class AliasController extends JPanel
addAlias( new Alias( "New Alias" ) );
break;
case COPY_ALIAS:
Alias selected = getSelectedAlias();
if( selected != null )
for( Alias alias: getSelectedAliases() )
{
addAlias( AliasFactory.copyOf( selected ) );
addAlias( AliasFactory.copyOf( alias ) );
}
break;
case DELETE_ALIAS:
Alias toDelete = getSelectedAlias();
List<Alias> toDelete = getSelectedAliases();
if( toDelete != null )
if( toDelete != null && !toDelete.isEmpty() )
{
String title = toDelete.size() == 1 ? "Delete Alias?" : "Delete Aliases?";
String prompt = toDelete.size() == 1 ? "Do you want to delete this alias?" :
"Do you want to delete these " + toDelete.size() + " aliases?";
int choice = JOptionPane.showConfirmDialog( AliasController.this,
"Do you want to delete this alias?", "Delete Alias?",
JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE );
prompt, title, JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE );
if( choice == JOptionPane.YES_OPTION )
{
mAliasModel.removeAlias( toDelete );
for( Alias alias: toDelete )
{
mAliasModel.removeAlias( alias );
}
}
}
break;

View File

@@ -255,6 +255,8 @@ public class AliasNameEditor extends Editor<Alias>
mButtonColor.setForeground( getForeground() );
}
repaint();
setModified( false );
}

View File

@@ -261,21 +261,25 @@ public class MultipleAliasEditor extends Editor<List<Alias>>
groupNames.add( 0, "" );
mGroupCombo.setModel( new DefaultComboBoxModel<String>(
groupNames.toArray( new String[ groupNames.size() ] ) ) );
setCheckBoxesUnselected();
setModified( false );
}
@Override
public void reset()
private void setCheckBoxesUnselected()
{
//Reset multi-editor controls
mListCheckBox.setSelected( false );
mGroupCheckBox.setSelected( false );
mColorCheckBox.setSelected( false );
mIconCheckBox.setSelected( false );
mRecordCheckBox.setSelected( false );
mPriorityCheckBox.setSelected( false );
}
@Override
public void reset()
{
List<String> listNames = mAliasModel.getListNames();
listNames.add( 0, "" );
mListCombo.setModel( new DefaultComboBoxModel<String>(

View File

@@ -15,7 +15,6 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
******************************************************************************/
package controller.channel;
import java.util.HashMap;
@@ -33,7 +32,6 @@ import module.log.EventLogManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import playlist.PlaylistManager;
import record.RecorderManager;
import record.RecorderType;
import sample.Listener;
@@ -44,7 +42,6 @@ import alias.AliasModel;
import audio.AudioPacket;
import audio.metadata.Metadata;
import audio.metadata.MetadataType;
import controller.ThreadPoolManager;
import controller.channel.Channel.ChannelType;
import controller.channel.ChannelEvent.Event;
import controller.channel.map.ChannelMapModel;
@@ -65,15 +62,13 @@ public class ChannelProcessingManager implements ChannelEventListener
private EventLogManager mEventLogManager;
private RecorderManager mRecorderManager;
private SourceManager mSourceManager;
private ThreadPoolManager mThreadPoolManager;
public ChannelProcessingManager( ChannelModel channelModel,
ChannelMapModel channelMapModel,
AliasModel aliasModel,
EventLogManager eventLogManager,
RecorderManager recorderManager,
SourceManager sourceManager,
ThreadPoolManager threadPoolManager )
SourceManager sourceManager )
{
mChannelModel = channelModel;
mChannelMapModel = channelMapModel;
@@ -81,7 +76,6 @@ public class ChannelProcessingManager implements ChannelEventListener
mEventLogManager = eventLogManager;
mRecorderManager = recorderManager;
mSourceManager = sourceManager;
mThreadPoolManager = threadPoolManager;
}
/**
@@ -108,7 +102,7 @@ public class ChannelProcessingManager implements ChannelEventListener
}
@Override
public void channelChanged( ChannelEvent event )
public synchronized void channelChanged( ChannelEvent event )
{
Channel channel = event.getChannel();

View File

@@ -136,10 +136,8 @@ public class SDRTrunk implements Listener<TunerEvent>
SourceManager sourceManager = new SourceManager( tunerModel,
mSettingsManager, threadPoolManager );
ChannelProcessingManager channelProcessingManager =
new ChannelProcessingManager( channelModel, channelMapModel,
aliasModel, eventLogManager, recorderManager,
sourceManager, threadPoolManager );
ChannelProcessingManager channelProcessingManager = new ChannelProcessingManager(
channelModel, channelMapModel, aliasModel, eventLogManager, recorderManager, sourceManager );
channelProcessingManager.addAudioPacketListener( recorderManager );
channelModel.addListener( channelProcessingManager );

View File

@@ -104,7 +104,7 @@ public class DecoderViewFrame extends JInternalFrame
ChannelProcessingManager channelProcessingManager =
new ChannelProcessingManager( channelModel, channelMapModel,
new AliasModel(), new EventLogManager(), null, null, new ThreadPoolManager() );
new AliasModel(), new EventLogManager(), null, null );
List<Module> modules = DecoderFactory.getModules( channelModel,
channelMapModel, channelProcessingManager, new AliasModel(), channel );