package com.limegroup.gnutella.bugs; import javax.swing.JDialog; import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.JOptionPane; import javax.swing.BoxLayout; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.JTextArea; import javax.swing.JScrollPane; import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.Dimension; import java.awt.Toolkit; import com.limegroup.gnutella.gui.MultiLineLabel; /** * A bare-bones bug manager, for fatal errors. */ public final class FatalBugManager { private FatalBugManager() {} /** * Handles a fatal bug. */ public static void handleFatalBug(Throwable bug) { if( bug instanceof ThreadDeath ) // must rethrow. throw (ThreadDeath)bug; bug.printStackTrace(); // Build the LocalClientInfo out of the info ... LocalClientInfo info = new LocalClientInfo(bug, Thread.currentThread().getName(), null, true); reviewBug(info); } /** * Reviews the bug. */ public static void reviewBug(final LocalClientInfo info) { final JDialog DIALOG = new JDialog(); DIALOG.setTitle("Fatal Error"); final Dimension DIALOG_DIMENSION = new Dimension(100, 300); DIALOG.setSize(DIALOG_DIMENSION); JPanel mainPanel = new JPanel(); mainPanel.setBorder(BorderFactory.createEmptyBorder(10,10,10,10)); mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); MultiLineLabel label = new MultiLineLabel( "LimeWire has encountered a fatal internal error and will now exit. " + "This is generally caused by a corrupted installation. Please try " + "downloading and installing LimeWire again.\n\n" + "To aid with debugging, please click 'Send' to notify LimeWire about the problem. " + "If desired, you can click 'Review' to look at the information that will be sent. " + "If the problem persists, please copy " + "and paste the 'review' message and send it to: bugs@limewire.com.\n\n" + "Thank You.", 400); JPanel labelPanel = new JPanel(); labelPanel.setLayout(new BoxLayout(labelPanel, BoxLayout.X_AXIS)); labelPanel.add(Box.createHorizontalGlue()); labelPanel.add(label); JPanel buttonPanel = new JPanel(); JButton sendButton = new JButton("Send"); sendButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { sendToServlet(info); DIALOG.dispose(); System.exit(1); } }); JButton reviewButton = new JButton("Review"); reviewButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JTextArea textArea = new JTextArea(info.toBugReport()); textArea.setColumns(50); textArea.setEditable(false); textArea.selectAll(); textArea.copy(); textArea.setCaretPosition(0); JScrollPane scroller = new JScrollPane(textArea); scroller.setBorder(BorderFactory.createEtchedBorder()); scroller.setPreferredSize( new Dimension(500, 200) ); showMessage(DIALOG, scroller); } }); JButton discardButton = new JButton("Discard"); discardButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { DIALOG.dispose(); System.exit(1); } }); buttonPanel.add(sendButton); buttonPanel.add(reviewButton); buttonPanel.add(discardButton); mainPanel.add(labelPanel); mainPanel.add(buttonPanel); DIALOG.getContentPane().add(mainPanel); DIALOG.pack(); Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); Dimension dialogSize = DIALOG.getSize(); DIALOG.setLocation((screenSize.width - dialogSize.width)/2, (screenSize.height - dialogSize.height)/2); DIALOG.show(); } /** * Sends a bug to the servlet & then exits. */ private static void sendToServlet(LocalClientInfo info) { new ServletAccessor().getRemoteBugInfo(info); } /** * Shows a message. */ private static void showMessage(Component parent, Component toDisplay) { JOptionPane.showMessageDialog(parent, toDisplay, "Fatal Error - Review", JOptionPane.INFORMATION_MESSAGE); } }