package de.lighti.components; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.AbstractAction; import javax.swing.JFileChooser; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import de.lighti.DotaPlay.ProgressListener; import de.lighti.Dotalys2App; import de.lighti.components.batch.BatchDialog; import de.lighti.io.DataImporter; import de.lighti.model.AppState; public class DotalysMenuBar extends JMenuBar { /** * */ private static final long serialVersionUID = -152856153942387447L; private final Dotalys2App owner; private JMenu fileMenu; private JMenuItem fileOpenMenuItem; private JMenuItem batchExportMenuItem; private JMenuItem aboutMenuItem; public DotalysMenuBar( Dotalys2App o ) { super(); setLayout( new FlowLayout( FlowLayout.LEFT ) ); owner = o; add( getFileMenu() ); add( getBatchExportItem() ); add( getAboutMenuItem() ); } private JMenuItem getAboutMenuItem() { if (aboutMenuItem == null) { aboutMenuItem = new JMenuItem(); aboutMenuItem.setAction( new AbstractAction() { /** * */ private static final long serialVersionUID = -7625044491823967L; @Override public void actionPerformed( ActionEvent e ) { final String message = "<html>Dotalys2 is a replay parser and analysis tool for Valve's popular Dota2 MOBA game.<br/>It has been written by me, Tobias Mahlmann, in 2013-2014.<br/>I am in no way affiliated with Valve. The software is provided \"as is\" as a research project and I assume no liability.<br/>If you'd like to contact me, mail me at <a href='mailto:t.mahlmann@gmail.com'>t.mahlmann@gmail.com</a> or surf to <a href='http://www.lighti.de'>www.lighti.de</a><br/>This software use the following open source libraries:<ul><li>JFreeChart <a href='http://www.jfree.org'>http://www.jfree.org</a></li><li>Google's Protocol Buffer <a href='https://code.google.com/p/protobuf/'>https://code.google.com/p/protobuf/</a></li><li>Snappy for Java <a href='https://code.google.com/p/snappy-java/'>https://code.google.com/p/snappy-java/</a></li></ul>Acknowledgements go out to github user dschleck for his white-paper on parsing Dota2 packet entities <a href='https://github.com/dschleck/edith'>https://github.com/dschleck/edith</a></html>"; JOptionPane.showMessageDialog( owner, message, "About", JOptionPane.INFORMATION_MESSAGE ); } } ); aboutMenuItem.setText( "About" ); } return aboutMenuItem; } private JMenuItem getBatchExportItem() { if (batchExportMenuItem == null) { batchExportMenuItem = new JMenuItem( "Batch Export" ); batchExportMenuItem.addActionListener( new ActionListener() { @Override public void actionPerformed( ActionEvent arg0 ) { new BatchDialog( owner ).setVisible( true ); } } ); } return batchExportMenuItem; } public JMenu getFileMenu() { if (fileMenu == null) { fileMenu = new JMenu( "File" ); fileMenu.add( getFileOpenMenuItem() ); } return fileMenu; } public JMenuItem getFileOpenMenuItem() { if (fileOpenMenuItem == null) { fileOpenMenuItem = new JMenuItem(); fileOpenMenuItem.setAction( new AbstractAction() { /** * */ private static final long serialVersionUID = 437644308981178302L; @Override public void actionPerformed( ActionEvent e ) { // Create a file chooser final JFileChooser fc = new JFileChooser( "." ); fc.setFileFilter( DataImporter.FILE_FILTER ); // In response to a button click: final int returnVal = fc.showOpenDialog( owner ); if (returnVal == JFileChooser.APPROVE_OPTION) { final AppState appState = owner.getAppState(); appState.clear(); final ProgressDialog pd = new ProgressDialog( owner ); final long fs = fc.getSelectedFile().length(); pd.setMaximum( fs ); final Thread t = new Thread( new Runnable() { @Override public void run() { DataImporter.parseReplayFile( appState, owner, fc.getSelectedFile(), new ProgressListener() { @Override public void bytesRemaining( int position ) { pd.setValue( fs - position ); } } ); pd.setVisible( false ); } } ); t.start(); pd.setVisible( true ); } } } ); fileOpenMenuItem.setText( "Open" ); } return fileOpenMenuItem; } }