/******************************************************************************* * SDR Trunk * Copyright (C) 2014 Dennis Sheirer * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/> ******************************************************************************/ package instrument.gui; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.io.IOException; import javax.swing.JButton; import javax.swing.JDesktopPane; import javax.swing.JInternalFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; import net.miginfocom.swing.MigLayout; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import source.IControllableFileSource; import source.IFrameLocationListener; public class SourceControllerFrame extends JInternalFrame implements IFrameLocationListener { private static final long serialVersionUID = 1L; private final static Logger mLog = LoggerFactory.getLogger( SourceControllerFrame.class ); private IControllableFileSource mSource; private JDesktopPane mDesktop; private JLabel mCurrentPosition = new JLabel( "0" ); public SourceControllerFrame( IControllableFileSource source, JDesktopPane desktop ) { mSource = source; mSource.setListener( this ); mDesktop = desktop; initGui(); } private void initGui() { setTitle( "Source [" + mSource.getFile().getAbsolutePath() + "]" ); setPreferredSize( new Dimension( 670, 70 ) ); setSize( 670, 70 ); setResizable( true ); setClosable( true ); setIconifiable( true ); setMaximizable( false ); JPanel panel = new JPanel(); panel.setLayout( new MigLayout() ); JButton decoderButton = new JButton( "Decoders" ); decoderButton.addActionListener( new ActionListener() { @Override public void actionPerformed( ActionEvent e ) { EventQueue.invokeLater( new Runnable() { @Override public void run() { DecoderSelectionFrame frame = new DecoderSelectionFrame( mDesktop, mSource ); frame.setVisible( true ); mDesktop.add( frame ); } } ); } } ); panel.add( decoderButton ); panel.add( new JLabel( "Skip:" ) ); panel.add( new SkipFramesField( mSource ) ); panel.add( new NextFrameButton( mSource, "> 1", 1 ) ); panel.add( new NextFrameButton( mSource, "> 10", 10 ) ); panel.add( new NextFrameButton( mSource, "> 100", 100 ) ); panel.add( new NextFrameButton( mSource, "> 1000", 1000 ) ); panel.add( new JLabel( "Posn:" ) ); panel.add( mCurrentPosition, "wrap" ); add( panel ); } public class NextFrameButton extends JButton { private static final long serialVersionUID = 1L; private IControllableFileSource mSource; private int mFrames; public NextFrameButton( IControllableFileSource source, String label, int frames ) { super( label ); mSource = source; mFrames = frames; addActionListener( new ActionListener() { @Override public void actionPerformed( ActionEvent arg0 ) { EventQueue.invokeLater( new Runnable() { @Override public void run() { try { mSource.next( mFrames ); } catch ( IOException e ) { mLog.error( "Viewer - reading frames [" + mFrames + "] from source", e ); JOptionPane.showMessageDialog( SourceControllerFrame.this, "Can't read " + mFrames + " more frames [" + e.getLocalizedMessage() + "]", "Wave File Error", JOptionPane.ERROR_MESSAGE ); } } } ); } } ); } } public class SkipFramesField extends JTextField { private static final long serialVersionUID = 1L; private IControllableFileSource mSource; public SkipFramesField( IControllableFileSource source ) { super( "0" ); mSource = source; setMinimumSize( new Dimension( 100, getHeight() ) ); addFocusListener( new FocusListener() { @Override public void focusGained( FocusEvent arg0 ) {} @Override public void focusLost( FocusEvent arg0 ) { try { int framesToSkip = Integer.parseInt( getText() ); mSource.next( framesToSkip, false ); } catch( Exception e ) { mLog.error( "WaveSourceFrame - error skipping frames", e ); JOptionPane.showMessageDialog( SourceControllerFrame.this, "Can't skip [" + getText() + "] frames.", "Error", JOptionPane.ERROR_MESSAGE ); } } } ); } } @Override public void frameLocationUpdated( final int location ) { EventQueue.invokeLater( new Runnable() { @Override public void run() { mCurrentPosition.setText( String.valueOf( location ) ); } } ); } @Override public void frameLocationReset() { // TODO Auto-generated method stub } }