package edu.mbl.jif.utils.diag.eel; /* * EEL.java */ /** * EEL: Every Event Logger. This class logs all possible events * to specified output streams. A listener for every event type in the * AWT and Swing packages is included. Singleton listeners are enforced * through the use of static getListener calls. */ import java.io.*; import java.util.*; import java.beans.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; public class EEL implements ActionListener, AdjustmentListener, AWTEventListener, ComponentListener, ContainerListener, FocusListener, InputMethodListener, ItemListener, KeyListener, MouseListener, MouseMotionListener, TextListener, WindowListener, // but wait! there's more! AncestorListener, CaretListener, CellEditorListener, ChangeListener, DocumentListener, HyperlinkListener, InternalFrameListener, ListDataListener, ListSelectionListener, MenuDragMouseListener, MenuListener, MouseInputListener, PopupMenuListener, TableColumnModelListener, TableModelListener, TreeExpansionListener, TreeModelListener, TreeSelectionListener, TreeWillExpandListener, UndoableEditListener, PropertyChangeListener, VetoableChangeListener // And even more...stop the madness! // DnD support should go in here, too... { private static LinkedList loggers = new LinkedList(); private JTextArea guiStream = new JTextArea(); private JFrame guiDisplay = new JFrame("Event Logger"); private static EEL eel; private boolean reportErrors = false; private boolean toErr = false; private boolean toOut = false; private boolean toGui = false; public static EEL getInstance() { if (eel == null) { eel = new EEL(); } return eel; } private EEL() { // Don't let anyone else instantiate this class addErr(); setReportErrors(true); guiDisplay.setSize(400,600); guiDisplay.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); guiStream.setEditable(false); JButton clearB, closeB; JPanel buttonPane = new JPanel(); clearB = new JButton("Clear"); closeB = new JButton("Close"); buttonPane.add(clearB); buttonPane.add(closeB); guiDisplay.getContentPane().add(new JScrollPane(guiStream), BorderLayout.CENTER); guiDisplay.getContentPane().add(buttonPane, BorderLayout.SOUTH); clearB.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { guiStream.setText(""); } }); closeB.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { guiDisplay.setVisible(false); } }); } /** * Turn on error reporting for this class. All errors will be sent * to STDERR. */ public void setReportErrors(boolean showErrors) { reportErrors = showErrors; } /** * Add STDERR to the list of log streams. */ public void addErr() { toErr = true; } /** * Add STDOUT to the list of log streams. */ public void addOut() { toOut = true; } /** * Add a graphical window to the list of log streams. */ public void addGui() { toGui = true; } /** * Remove STDERR from the list of log streams. */ public void removeErr() { toErr = false; } /** * Remove STDOUT from the list of log streams. */ public void removeOut() { toOut = false; } /** * Remove the graphical window from the list of log streams. */ public void removeGui() { toGui = false; } /** * Add specified PrintWriter to list of log streams. */ public void addStream(PrintWriter pw) { } /** * Create a PrintWriter on the given filename and then add * it to the list of log streams. */ public void addStream(String logname) { try { addStream(new PrintWriter(new FileWriter(logname))); } catch(Exception e) { if (reportErrors) { System.err.println("Could not create writer for " + logname); } } } /** * Put the graphical logger window on the screen. Note that this does * not affect the status of the gui stream logging. You should call * addGui() to ensure this logger will receive copies of the events * along with the other loggers. */ public void showDialog() { if (eel.guiDisplay != null) { eel.guiDisplay.setVisible(true); if (eel.guiDisplay.getState() == Frame.ICONIFIED) { eel.guiDisplay.setState(Frame.NORMAL); } } } /** * Hide the graphical logger. Note that this does not affect the status * of the gui stream logging. I.e. this does not call removeGui() * automatically. This method merely removes the window from the screen. * Logging can still occur to the text area of the window. This may be * desirable, but if not, you should call removeGui() yourself just before * hiding the window. */ public void hideDialog() { if ((eel.guiDisplay != null) && (eel.guiDisplay.isShowing())) { eel.guiDisplay.setVisible(false); } } public void log(String msg) { // output a copy of msg to every registered log stream if (toErr) { System.err.println(msg); } if (toOut) { System.out.println(msg); } if (toGui) { eel.guiStream.append(msg); if (!msg.endsWith("\n")) { eel.guiStream.append("\n"); } } Iterator i = loggers.iterator(); while (i.hasNext()) { ((PrintWriter)i.next()).println(msg); } } // ActionListener methods public void actionPerformed(ActionEvent ae) { log("ActionPerformed: " + ae); } // AdjusmetListener methods public void adjustmentValueChanged(AdjustmentEvent ae) { log("ValueAdjusted: " + ae); } // AWTEventListener methods public void eventDispatched(AWTEvent ae) { log("EventDispatched: " + ae); } // ComponentListener methods public void componentHidden(ComponentEvent ce) { log("ComponentHidden: " + ce); } public void componentMoved(ComponentEvent ce) { log("ComponentMoved: " + ce); } public void componentResized(ComponentEvent ce) { log("ComponentResized: " + ce); } public void componentShown(ComponentEvent ce) { log("ComponentShown: " + ce); } // ContainerListener methods public void componentAdded(ContainerEvent ce) { log("ComponentAdded: " + ce); } public void componentRemoved(ContainerEvent ce) { log("ComponentRemoved: " + ce); } // FocusListener methods public void focusGained(FocusEvent fe) { log("FocusGained: " + fe); } public void focusLost(FocusEvent fe) { log("FocusLost: " + fe); } // HierarchyBoundsListener methods [[new to 1.4?]] // HierarchyListener methods [[new to 1.4?]] // InputMethodListener methods public void caretPositionChanged(InputMethodEvent ime) { log("CaretPosition: " + ime); } public void inputMethodTextChanged(InputMethodEvent ime) { log("InputMethodText: " + ime); } // ItemListener methods public void itemStateChanged(ItemEvent ie) { log("ItemStateChanged: " + ie); } // KeyListener methods public void keyPressed(KeyEvent ke) { log("KeyPressed: " + ke); } public void keyReleased(KeyEvent ke) { log("KeyReleased: " + ke); } public void keyTyped(KeyEvent ke) { log("KeyTyped: " + ke); } // MouseListener methods public void mouseEntered(MouseEvent me) { log("MouseEntered: " + me); } public void mouseExited(MouseEvent me) { log("MouseExited: " + me); } public void mousePressed(MouseEvent me) { log("MousePressed: " + me); } public void mouseReleased(MouseEvent me) { log("MouseReleased: " + me); } public void mouseClicked(MouseEvent me) { log("MouseClicked: " + me); } // MouseMotionListener methods public void mouseMoved(MouseEvent me) { log("MouseMoved: " + me); } public void mouseDragged(MouseEvent me) { log("MouseDragged: " + me); } // MouseWheelListener methods [[new to 1.4?]] // TextListener methods public void textValueChanged(TextEvent te) { log("TextChanged: " + te); } // WindowListener methods public void windowClosing(WindowEvent we) { log("WindowClosing: " + we); } public void windowClosed(WindowEvent we) { log("WindowClosed: " + we); } public void windowOpened(WindowEvent we) { log("WindowOpened: " + we); } public void windowIconified(WindowEvent we) { log("WindowIconified: " + we); } public void windowDeiconified(WindowEvent we) { log("WindowDeiconified: " + we); } public void windowActivated(WindowEvent we) { log("WindowActivated: " + we); } public void windowDeactivated(WindowEvent we) { log("WindowDeactivated: " + we); } // WindowFocusListener methods [[new to 1.4?]] // WindowStateListener methods [[new to 1.4?]] // *** SWING EVENTS *** // AncestorListener methods public void ancestorAdded(AncestorEvent ae) { log("AncestorAdded: " + ae); } public void ancestorMoved(AncestorEvent ae) { log("AncestorMoved: " + ae); } public void ancestorRemoved(AncestorEvent ae) { log("AncestorRemoved: " + ae); } // CaretListener methods public void caretUpdate(CaretEvent ce) { log("CaretUpdated: " + ce); } // CellEditorListener methods public void editingCanceled(ChangeEvent ce) { log("EditingCanceled: " + ce); } public void editingStopped(ChangeEvent ce) { log("EditingStopped: " + ce); } // ChangeListener methods public void stateChanged(ChangeEvent ce) { log("StateChanged: " + ce); } // DocumentListener methods public void changedUpdate(DocumentEvent de) { log("ChangedUpdate: " + de); } public void insertUpdate(DocumentEvent de) { log("InsertUpdate: " + de); } public void removeUpdate(DocumentEvent de) { log("RemoveUpdate: " + de); } // HyperlinkListener methods public void hyperlinkUpdate(HyperlinkEvent he) { log("HyperlinkUpdate: " + he); } // InternalFrameListener methods public void internalFrameActivated(InternalFrameEvent ife) { log("InternalFrameActivated: " + ife); } public void internalFrameClosed(InternalFrameEvent ife) { log("InternalFrameClosed: " + ife); } public void internalFrameClosing(InternalFrameEvent ife) { log("InternalFrameClosing: " + ife); } public void internalFrameDeactivated(InternalFrameEvent ife) { log("InternalFrameDeactivated: " + ife); } public void internalFrameDeiconified(InternalFrameEvent ife) { log("InternalFrameDeiconified: " + ife); } public void internalFrameIconified(InternalFrameEvent ife) { log("InternalFrameIconified: " + ife); } public void internalFrameOpened(InternalFrameEvent ife) { log("InternalFrameOpened: " + ife); } // ListDataListener methods public void contentsChanged(ListDataEvent lde) { log("ContentsChanged: " + lde); } public void intervalAdded(ListDataEvent lde) { log("IntervalAdded: " + lde); } public void intervalRemoved(ListDataEvent lde) { log("IntervalRemoved: " + lde); } // ListSelectionListener methods public void valueChanged(ListSelectionEvent lse) { log("ListValueChanged: " + lse); } // MenuDragMouseListener methods public void menuDragMouseDragged(MenuDragMouseEvent mdme) { log("MenuMouseDragged: " + mdme); } public void menuDragMouseEntered(MenuDragMouseEvent mdme) { log("MenuMouseEntered: " + mdme); } public void menuDragMouseExited(MenuDragMouseEvent mdme) { log("MenuMouseExited: " + mdme); } public void menuDragMouseReleased(MenuDragMouseEvent mdme) { log("MenuMouseReleased: " + mdme); } // MenuKeyListener methods public void menuKeyPressed(MenuKeyEvent mke) { log("MenuKeyPressed: " + mke); } public void menuKeyReleased(MenuKeyEvent mke) { log("MenuKeyReleased: " + mke); } public void menuKeyTyped(MenuKeyEvent mke) { log("MenuKeyTyped: " + mke); } // MenuListener methods public void menuCanceled(MenuEvent me) { log("MenuCanceled: " + me); } public void menuDeselected(MenuEvent me) { log("MenuDeselected: " + me); } public void menuSelected(MenuEvent me) { log("MenuSelected: " + me); } // MouseInputListener methods // This is actually a convenience listener that combines the // MouseListener and MouseMotionListener methods into one spot. // We've written those methods, so we have nothing extra to do // here... // PopupMenuListener methods public void popupMenuWillBecomeInvisible(PopupMenuEvent pme) { log("PopupWillBeInvisible: " + pme); } public void popupMenuWillBecomeVisible(PopupMenuEvent pme) { log("PopupWillBeVisible: " + pme); } public void popupMenuCanceled(PopupMenuEvent pme) { log("PopupCanceled: " + pme); } // TableColumnModelListener methods public void columnAdded(TableColumnModelEvent tcme) { log("ColumnAdded: " + tcme); } public void columnMarginChanged(ChangeEvent ce) { log("ColumnMarginChanged: " + ce); } public void columnMoved(TableColumnModelEvent tcme) { log("ColumnMoved: " + tcme); } public void columnRemoved(TableColumnModelEvent tcme) { log("ColumnRemoved: " + tcme); } public void columnSelectionChanged(ListSelectionEvent lse) { log("ColumnSelectionChanged: " + lse); } // TableModelListener methods public void tableChanged(TableModelEvent tme) { log("TableChanged: " + tme); } // TreeExpansionListener methods public void treeCollapsed(TreeExpansionEvent tee) { log("TreeCollapsed: " + tee); } public void treeExpanded(TreeExpansionEvent tee) { log("TreeExpanded: " + tee); } // TreeModelListener methods public void treeNodesChanged(TreeModelEvent tme) { log("TreeNodesChanged: " + tme); } public void treeNodesInserted(TreeModelEvent tme) { log("TreeNodesInserted: " + tme); } public void treeNodesRemoved(TreeModelEvent tme) { log("TreeNodesRemoved: " + tme); } public void treeStructureChanged(TreeModelEvent tme) { log("TreeStructureChanged: " + tme); } // TreeSelectionListener methods public void valueChanged(TreeSelectionEvent tse) { log("TreeValueChanged: " + tse); } // TreeWillExpandListener methods public void treeWillCollapse(TreeExpansionEvent tee) { log("TreeWillCollapse: " + tee); } public void treeWillExpand(TreeExpansionEvent tee) { log("TreeWillExpand: " + tee); } // UndoableEditListener methods public void undoableEditHappened(UndoableEditEvent uee) { log("UndoableEditHappened: " + uee); } //*** JAVABEANS LISTENERS *** // PropertyChangeListener methods public void propertyChange(PropertyChangeEvent pce) { log("PropertyChange: " + pce); } // VetoableChangeListener methods public void vetoableChange(PropertyChangeEvent pce) { log("VetoableChange: " + pce); } }