psmith 2003/08/07 00:56:04 Modified: src/java/org/apache/log4j/chainsaw LogUI.java Log: Added infrastructure for ShutdownListener and the ability to register a different Shutdown Action when a shutdown is requested. By default, Chainsaw exits the VM, but the developer may choose to override this. Revision Changes Path 1.7 +78 -2 jakarta-log4j/src/java/org/apache/log4j/chainsaw/LogUI.java Index: LogUI.java =================================================================== RCS file: /home/cvs/jakarta-log4j/src/java/org/apache/log4j/chainsaw/LogUI.java,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- LogUI.java 22 Jul 2003 03:07:47 -0000 1.6 +++ LogUI.java 7 Aug 2003 07:56:04 -0000 1.7 @@ -148,6 +148,7 @@ import javax.swing.event.ChangeListener; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; +import javax.swing.event.EventListenerList; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.event.TableColumnModelEvent; @@ -226,6 +227,26 @@ */ private boolean isGUIFullyInitialized = false; private Object initializationLock = new Object(); + + /** + * The shutdownAction is called when the user requests to exit + * Chainsaw, and by default this exits the VM, but + * a developer may replace this action with something that better suits + * their needs + */ + private Action shutdownAction = new AbstractAction() { + + public void actionPerformed(ActionEvent e) + { + System.exit(0); + } + }; + + /** + * Clients can register a ShutdownListener to be notified + * when the user has requested Chainsaw to exit. + */ + private EventListenerList shutdownListenerList = new EventListenerList(); /** * Constructor which builds up all the visual elements of the frame @@ -258,6 +279,27 @@ } /** + * Registers a ShutdownListener with this calss so that + * it can be notified when the user has requested + * that Chainsaw exit. + * + * @param l + */ + public void addShutdownListener(ShutdownListener l) { + shutdownListenerList.add(ShutdownListener.class, l); + } + + /** + * Removes the registered ShutdownListener so + * that the listener will not be notified on a shutdown. + * + * @param l + */ + public void removeShutdownListener(ShutdownListener l) { + shutdownListenerList.remove(ShutdownListener.class, l); + } + + /** * Starts Chainsaw by attaching a new instance to the Log4J * main root Logger via a ChainsawAppender, and activates itself * @param args @@ -760,12 +802,46 @@ } catch (Exception e) { e.printStackTrace(); } - - System.exit(0); + fireShutdownEvent(); + performShutdownAction(); } + }; new Thread(runnable).start(); + } + + /** + * Ensures all the registered ShutdownListeners are notified. + */ + private void fireShutdownEvent() + { + ShutdownListener[] listeners = (ShutdownListener[]) shutdownListenerList.getListeners(ShutdownListener.class); + for (int i = 0; i < listeners.length; i++) { + listeners[i].shuttingDown(); + } + } + + /** + * Configures LogUI's with an action to execute when the user + * requests to exit the application, the default action + * is to exit the VM. + * This Action is called AFTER all the ShutdownListeners have been notified + * + * @param shutdownAction + */ + public final void setShutdownAction(Action shutdownAction){ + this.shutdownAction = shutdownAction; + } + + /** + * Using the current thread, calls the registed Shutdown action's + * actionPerformed(...) method. + * + */ + private void performShutdownAction(){ + LogLog.debug("Calling the shutdown Action. Goodbye!"); + shutdownAction.actionPerformed(new ActionEvent(this, ActionEvent.ACTION_PERFORMED, "Shutting Down")); } /**
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]