package de.lighti.components.map; import java.awt.FlowLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.IOException; import java.util.Timer; import java.util.TimerTask; import javax.imageio.ImageIO; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComponent; import javax.swing.JFileChooser; import javax.swing.JOptionPane; import javax.swing.JSlider; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.filechooser.FileFilter; import de.lighti.io.DataExporter; import de.lighti.model.AppState; import de.lighti.model.Statics; public class OptionContainer extends JComponent { /** * */ private static final long serialVersionUID = -7333865570478624736L; private final MapComponent mapComponent; private final AppState appState; private JButton exportButton; private JCheckBox allButton; private JSlider stepSlider; private JButton playButton; private JButton stopButton; private TimerTask animation; public OptionContainer( final MapComponent mapComponent, AppState appState ) { super(); this.mapComponent = mapComponent; this.appState = appState; setLayout( new FlowLayout( FlowLayout.LEFT ) ); add( getAllButton() ); add( getExportButton() ); add( getStepSlider() ); add( getPlayButton() ); add( getStopButton() ); final JButton toggleButton = new JButton( Statics.MAP_ZONES ); toggleButton.addActionListener( new ActionListener() { @Override public void actionPerformed( ActionEvent e ) { mapComponent.getMapCanvas().setPaintMapModel( !mapComponent.getMapCanvas().isPaintMapModel() ); mapComponent.getMapCanvas().repaint(); } } ); add( toggleButton ); } private ActionListener createExportButtonActionListener() { return new ActionListener() { @Override public void actionPerformed( ActionEvent e ) { // final DefaultMutableTreeNode node = (DefaultMutableTreeNode) mapComponent.getAttributeTree().getLastSelectedPathComponent(); // if (node != null && node.isLeaf()) { // final String selection = (String) node.getUserObject(); // final Player p = appState.getPlayerByName( selection ); // if (p != null) { // final DefaultMutableTreeNode category = (DefaultMutableTreeNode) node.getParent(); // final String catName = (String) category.getUserObject(); // switch (catName) { // case MapComponent.CAT_MOVEMENT: // final String[][] log = ChartCreator.createMoveLog( p.getName(), appState ); // doSaveDialog( catName, log ); // break; // default: // JOptionPane.showMessageDialog( OptionContainer.this, "Exporting " + catName + " is not implemented", "We're terribly sorry", // JOptionPane.ERROR_MESSAGE ); // } // } // } JOptionPane.showMessageDialog( OptionContainer.this, "This button is disabled until I have time to fix it. Blease use the batch export instead." ); } }; } void doSaveDialog( String category, String[][] data ) { // Create a file chooser final JFileChooser fc = new JFileChooser( "." ); fc.setFileFilter( new FileFilter() { @Override public boolean accept( File f ) { return f.isDirectory() || f.getName().endsWith( ".csv" ); } @Override public String getDescription() { return "comma-separated values (*.csv)"; } } ); final int returnVal = fc.showSaveDialog( this ); if (returnVal == JFileChooser.APPROVE_OPTION) { try { String header = "# <unknown data>"; switch (category) { case MapComponent.CAT_MOVEMENT: header = "#tickms, x , y"; break; default: break; } DataExporter.exportCSV( fc.getSelectedFile(), header, data ); } catch (final IOException e) { JOptionPane.showMessageDialog( this, e.getLocalizedMessage(), "We're terribly sorry", JOptionPane.ERROR_MESSAGE ); } } } public JCheckBox getAllButton() { if (allButton == null) { allButton = new JCheckBox( Statics.ALL ); allButton.setEnabled( false ); allButton.addChangeListener( new ChangeListener() { @Override public void stateChanged( ChangeEvent e ) { final boolean allValue = allButton.isSelected(); getStepSlider().setEnabled( !allValue ); if (allValue) { mapComponent.getMapCanvas().resetDotSize(); mapComponent.getMapCanvas().resetTimeMarker(); getStopButton().setEnabled( false ); if (animation != null) { animation.cancel(); } } getPlayButton().setEnabled( !allValue ); } } ); } return allButton; } public JButton getExportButton() { if (exportButton == null) { exportButton = new JButton( Statics.EXPORT ); exportButton.addActionListener( createExportButtonActionListener() ); exportButton.setEnabled( false ); } return exportButton; } public JButton getPlayButton() { if (playButton == null) { try { final ImageIcon icon = new ImageIcon( ImageIO.read( getClass().getResource( "Play.gif" ) ) ); playButton = new JButton( icon ); // to remote the spacing between the image and button's borders playButton.setMargin( new Insets( 0, 0, 0, 0 ) ); // to remove the border playButton.setBorder( null ); } catch (final IOException e1) { playButton = new JButton( Statics.PLAY ); } playButton.setEnabled( false ); playButton.addActionListener( new ActionListener() { @Override public void actionPerformed( ActionEvent e ) { animation = new TimerTask() { @Override public void run() { final JSlider slider = getStepSlider(); slider.setValue( slider.getValue() + 1 ); if (slider.getValue() >= slider.getMaximum()) { cancel(); getPlayButton().setEnabled( true ); animation = null; } } }; final Timer timer = new Timer(); timer.schedule( animation, 0, 33 ); getPlayButton().setEnabled( false ); getStopButton().setEnabled( true ); } } ); } return playButton; } public JSlider getStepSlider() { if (stepSlider == null) { stepSlider = new JSlider(); stepSlider.setEnabled( false ); stepSlider.setMinimum( 0 ); stepSlider.setValue( 0 ); stepSlider.addChangeListener( new ChangeListener() { @Override public void stateChanged( ChangeEvent e ) { if (!getAllButton().isSelected()) { mapComponent.getMapCanvas().setDotSize( 5 ); mapComponent.getMapCanvas().setTimeMarker( stepSlider.getValue() ); } } } ); } return stepSlider; } public JButton getStopButton() { if (stopButton == null) { try { final ImageIcon icon = new ImageIcon( ImageIO.read( getClass().getResource( "Stop.gif" ) ) ); stopButton = new JButton( icon ); // to remote the spacing between the image and button's borders stopButton.setMargin( new Insets( 0, 0, 0, 0 ) ); // to remove the border stopButton.setBorder( null ); } catch (final IOException e1) { stopButton = new JButton( Statics.STOP ); } stopButton.setEnabled( false ); stopButton.addActionListener( new ActionListener() { @Override public void actionPerformed( ActionEvent e ) { animation.cancel(); getPlayButton().setEnabled( true ); getStopButton().setEnabled( false ); animation = null; } } ); } return stopButton; } @Override public void setEnabled( boolean enabled ) { super.setEnabled( enabled ); getExportButton().setEnabled( enabled ); getStepSlider().setEnabled( enabled ); mapComponent.getMapCanvas().resetTimeMarker(); getStepSlider().setValue( 0 ); getAllButton().setEnabled( enabled ); getAllButton().setSelected( enabled ); } }