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

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