package com.limegroup.gnutella.gui; import javax.swing.SwingUtilities; import com.limegroup.gnutella.ErrorCallback; /** * This class handles putting error callbacks onto the swing thread for * display. */ public final class ErrorHandler implements ErrorCallback { /** * Displays the error to the user. */ public void error(Throwable problem) { // ThreadDeath must NOT be caught, or a thread will be left zombied if(problem instanceof ThreadDeath) throw (ThreadDeath)problem; else { Runnable doWorkRunnable = new Error(problem, null); SwingUtilities.invokeLater(doWorkRunnable); } } /** * Displays the error to the user with a specific message. */ public void error(Throwable problem, String msg) { // ThreadDeath must NOT be caught, or a thread will be left zombied if(problem instanceof ThreadDeath) throw (ThreadDeath)problem; else { Runnable doWorkRunnable = new Error(problem, msg); SwingUtilities.invokeLater(doWorkRunnable); } } /** * This class handles error callbacks. */ private static class Error implements Runnable { /** * Constant for the <tt>Throwable</tt> error. */ private final Throwable PROBLEM; /** * Constant for the message to display. */ private final String MESSAGE; /** * Constant for the <tt>Thread</tt> that the error was caught in. */ private final String CURRENT_THREAD_NAME; private Error( Throwable problem, String msg ) { PROBLEM = problem; MESSAGE = msg; CURRENT_THREAD_NAME = Thread.currentThread().getName(); } public void run() { if( MESSAGE == null ) GUIMediator.showInternalError(PROBLEM, CURRENT_THREAD_NAME); else GUIMediator.showInternalError(PROBLEM, MESSAGE, CURRENT_THREAD_NAME); } } }