package de.ugoe.cs.eventbench.jfcmonitor; import java.awt.AWTEvent; import java.awt.Component; import java.awt.event.AWTEventListener; import java.awt.event.FocusEvent; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import java.io.IOException; import java.io.OutputStreamWriter; import de.ugoe.cs.util.StringTools; /** *

* This class implements monitoring of AWT and Swing mouse and keyboard events. * Each of the events is written to an output stream. *

* * @author Steffen Herbold * @version 1.0 */ public class JFCListener implements AWTEventListener { /** *

* Writer for logging events. *

*/ final private OutputStreamWriter outputWriter; /** *

* Constructor. Creates a new JFCListener with a given * {@link OutputStreamWriter}, where the monitored information is logged. *

* * @param outputWriter * writer for the logged information */ public JFCListener(OutputStreamWriter outputWriter) { this.outputWriter = outputWriter; try { outputWriter.write("" + StringTools.ENDLINE); outputWriter.write("" + StringTools.ENDLINE); } catch (IOException e) { System.err.println("JFCMONITOR -- Failure writing to log: " + e.getMessage()); } } /** *

* Writes all received {@link MouseEvent}s and {@link KeyEvent}s to the * {@link #outputWriter}. *

* * @see java.awt.event.AWTEventListener#eventDispatched(java.awt.AWTEvent) */ @Override public void eventDispatched(AWTEvent event) { StringBuilder builder = new StringBuilder(); if (event instanceof MouseEvent) { MouseEvent mouseEvent = (MouseEvent) event; if (!isMouseMovement(event.getID())) { builder.append("" + StringTools.ENDLINE); builder.append(" " + StringTools.ENDLINE); builder.append(" " + StringTools.ENDLINE); builder.append(" " + StringTools.ENDLINE); builder.append(" " + StringTools.ENDLINE); addSourceInfo(builder, event); builder.append("" + StringTools.ENDLINE); } } if (event instanceof KeyEvent) { KeyEvent keyEvent = (KeyEvent) event; if (keyEvent.getID() == KeyEvent.KEY_TYPED) { builder.append("" + StringTools.ENDLINE); builder.append(" " + StringTools.ENDLINE); builder.append(" " + StringTools.ENDLINE); addSourceInfo(builder, event); builder.append("" + StringTools.ENDLINE); } } if (event instanceof FocusEvent) { FocusEvent focusEvent = (FocusEvent) event; if( focusEvent.getID() == FocusEvent.FOCUS_GAINED ) { builder.append("" + StringTools.ENDLINE); addSourceInfo(builder, event); builder.append("" + StringTools.ENDLINE); } } if (builder.length() > 0 && outputWriter != null) { try { outputWriter.write(builder.toString()); outputWriter.flush(); } catch (IOException e) { System.err.println("JFCMONITOR -- Failure writing to log: " + e.getMessage()); } } } /** *

* Appends information about the event to a {@link StringBuilder}. *

* * @param builder * {@link StringBuilder} where the information is appended * @param event * event whose information is appended */ private void addSourceInfo(StringBuilder builder, AWTEvent event) { builder.append(" " + StringTools.ENDLINE); builder.append(" " + StringTools.ENDLINE); if (event.getSource() instanceof Component) { Component source = (Component) event.getSource(); JFCComponent jfcComponent = JFCComponent.find(source); if (jfcComponent != null) { builder.append(jfcComponent.getXML()); } } builder.append(" " + StringTools.ENDLINE); } /** *

* Checks if the Id of an {@link AWTEvent} is a mouse movement Id. *

* * @param eventId * id of the {@link AWTEvent} * @return true, if the event is a mouse movement event; false otherwise */ private boolean isMouseMovement(int eventId) { return eventId == MouseEvent.MOUSE_MOVED || eventId == MouseEvent.MOUSE_DRAGGED || eventId == MouseEvent.MOUSE_ENTERED || eventId == MouseEvent.MOUSE_EXITED; } }