/******************************************************************************* * Copyright (c) 2014 Jeff Martin. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Public License v3.0 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/gpl.html * * Contributors: * Jeff Martin - initial API and implementation ******************************************************************************/ package cuchaz.enigma.gui; import java.awt.BorderLayout; import java.awt.Container; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.PrintWriter; import java.io.StringWriter; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.WindowConstants; import cuchaz.enigma.Constants; public class CrashDialog { private static CrashDialog m_instance = null; private JFrame m_frame; private JTextArea m_text; private CrashDialog( JFrame parent ) { // init frame m_frame = new JFrame( Constants.Name + " - Crash Report" ); final Container pane = m_frame.getContentPane(); pane.setLayout( new BorderLayout() ); JLabel label = new JLabel( Constants.Name + " has crashed! =(" ); label.setBorder( BorderFactory.createEmptyBorder( 10, 10, 10, 10 ) ); pane.add( label, BorderLayout.NORTH ); // report panel m_text = new JTextArea(); m_text.setTabSize( 2 ); pane.add( new JScrollPane( m_text ), BorderLayout.CENTER ); // buttons panel JPanel buttonsPanel = new JPanel(); FlowLayout buttonsLayout = new FlowLayout(); buttonsLayout.setAlignment( FlowLayout.RIGHT ); buttonsPanel.setLayout( buttonsLayout ); buttonsPanel.add( GuiTricks.unboldLabel( new JLabel( "If you choose exit, you will lose any unsaved work." ) ) ); JButton ignoreButton = new JButton( "Ignore" ); ignoreButton.addActionListener( new ActionListener( ) { @Override public void actionPerformed( ActionEvent event ) { // close (hide) the dialog m_frame.setVisible( false ); } } ); buttonsPanel.add( ignoreButton ); JButton exitButton = new JButton( "Exit" ); exitButton.addActionListener( new ActionListener( ) { @Override public void actionPerformed( ActionEvent event ) { // exit enigma System.exit( 1 ); } } ); buttonsPanel.add( exitButton ); pane.add( buttonsPanel, BorderLayout.SOUTH ); // show the frame m_frame.setSize( 600, 400 ); m_frame.setLocationRelativeTo( parent ); m_frame.setDefaultCloseOperation( WindowConstants.DO_NOTHING_ON_CLOSE ); } public static void init( JFrame parent ) { m_instance = new CrashDialog( parent ); } public static void show( Throwable ex ) { // get the error report StringWriter buf = new StringWriter(); ex.printStackTrace( new PrintWriter( buf ) ); String report = buf.toString(); // show it! m_instance.m_text.setText( report ); m_instance.m_frame.doLayout(); m_instance.m_frame.setVisible( true ); } }