source: trunk/quest-jfcmonitor/src/main/java/de/ugoe/cs/quest/jfcmonitor/JFCListener.java @ 853

Last change on this file since 853 was 853, checked in by fglaser, 12 years ago
  • JFCMonitor now logs component class parents
  • Renamed WindowMonitor? to JFCWindowMonitor
  • Property svn:mime-type set to text/plain
File size: 5.0 KB
Line 
1
2package de.ugoe.cs.quest.jfcmonitor;
3
4import java.awt.AWTEvent;
5import java.awt.Component;
6import java.awt.event.AWTEventListener;
7import java.awt.event.FocusEvent;
8import java.awt.event.KeyEvent;
9import java.awt.event.MouseEvent;
10
11import de.ugoe.cs.util.StringTools;
12
13/**
14 * <p>
15 * This class implements monitoring of AWT and Swing mouse and keyboard events. Each of the events
16 * is written to an output stream.
17 * </p>
18 *
19 * @author Steffen Herbold
20 * @author Fabian Glaser
21 * @version 1.0
22 */
23public class JFCListener implements AWTEventListener {
24
25    /**
26     * <p>
27     * Writer for logging events.
28     * </p>
29     */
30    final private JFCMonitorOutputWriter outputWriter;
31
32    /**
33     * <p>
34     * Constructor. Creates a new JFCListener with a given {@link JFCMonitorOutputWriter}, where the
35     * monitored information is logged.
36     * </p>
37     *
38     * @param outputWriter
39     *            writer for the logged information
40     */
41    public JFCListener(JFCMonitorOutputWriter outputWriter) {
42        this.outputWriter = outputWriter;
43    }
44
45    /**
46     * <p>
47     * Writes all received {@link MouseEvent}s and {@link KeyEvent}s to the {@link #outputWriter}.
48     * </p>
49     *
50     * @see java.awt.event.AWTEventListener#eventDispatched(java.awt.AWTEvent)
51     */
52    @Override
53    public void eventDispatched(AWTEvent event) {
54        StringBuilder builder = new StringBuilder();
55
56        if (event instanceof MouseEvent) {
57            if (!isMouseMovement(event.getID())) {
58                MouseEvent mouseEvent = (MouseEvent) event;
59                builder.append("<event id=\"" + event.getID() + "\">" + StringTools.ENDLINE);
60                builder.append(" <param name=\"X\" value=\"" + mouseEvent.getX() + "\" />" +
61                    StringTools.ENDLINE);
62                builder.append(" <param name=\"Y\" value=\"" + mouseEvent.getY() + "\" />" +
63                    StringTools.ENDLINE);
64                builder.append(" <param name=\"Button\" value=\"" + mouseEvent.getButton() +
65                    "\" />" + StringTools.ENDLINE);
66                builder.append(" <param name=\"Modifiers\" value=\"" + mouseEvent.getModifiers() +
67                    "\" />" + StringTools.ENDLINE);
68                addSourceInfo(builder, event);
69                builder.append("</event>" + StringTools.ENDLINE);
70            }
71        }
72        else if (event instanceof KeyEvent) {
73            if (event.getID() == KeyEvent.KEY_PRESSED || event.getID() == KeyEvent.KEY_RELEASED) {
74                KeyEvent keyEvent = (KeyEvent) event;
75                builder.append("<event id=\"" + event.getID() + "\">" + StringTools.ENDLINE);
76                builder.append(" <param name=\"KeyCode\" value=\"" + keyEvent.getKeyCode() +
77                    "\" />" + StringTools.ENDLINE);
78                builder.append(" <param name=\"Modifiers\" value=\"" + keyEvent.getModifiers() +
79                    "\" />" + StringTools.ENDLINE);
80                addSourceInfo(builder, event);
81                builder.append("</event>" + StringTools.ENDLINE);
82            }
83        }
84        else if (event instanceof FocusEvent) {
85            if (event.getID() == FocusEvent.FOCUS_GAINED) {
86                builder.append("<event id=\"" + event.getID() + "\">" + StringTools.ENDLINE);
87                addSourceInfo(builder, event);
88                builder.append("</event>" + StringTools.ENDLINE);
89            }
90        }
91        if (builder.length() > 0 && outputWriter != null) {
92            outputWriter.write(builder.toString());
93        }
94    }
95
96    /**
97     * <p>
98     * Appends information about the event to a {@link StringBuilder}.
99     * </p>
100     *
101     * @param builder
102     *            {@link StringBuilder} where the information is appended
103     * @param event
104     *            event whose information is appended
105     */
106    private void addSourceInfo(StringBuilder builder, AWTEvent event) {
107        builder.append(" <source");
108        if (event.getSource() instanceof Component) {
109            Component source = (Component) event.getSource();
110            builder.append(" hash=\"" + Integer.toHexString(source.hashCode()) + "\"");
111        } 
112        builder.append(">" + StringTools.ENDLINE);
113        builder.append("  <param name=\"toString\" value=\"" +
114            StringTools.xmlEntityReplacement(event.getSource().toString()) + "\" />" +
115            StringTools.ENDLINE);
116        builder.append(" </source>" + StringTools.ENDLINE);
117    }
118
119    /**
120     * <p>
121     * Checks if the Id of an {@link AWTEvent} is a mouse movement Id.
122     * </p>
123     *
124     * @param eventId
125     *            id of the {@link AWTEvent}
126     * @return true, if the event is a mouse movement event; false otherwise
127     */
128    private boolean isMouseMovement(int eventId) {
129        return eventId == MouseEvent.MOUSE_MOVED || eventId == MouseEvent.MOUSE_DRAGGED ||
130            eventId == MouseEvent.MOUSE_ENTERED || eventId == MouseEvent.MOUSE_EXITED;
131    }
132
133}
Note: See TracBrowser for help on using the repository browser.