source: trunk/JFCMonitor/src/de/ugoe/cs/eventbench/jfcmonitor/JFCListener.java @ 370

Last change on this file since 370 was 370, checked in by sherbold, 12 years ago
  • added monitoring of keyboard focus to the JFCMonitor
  • Property svn:mime-type set to text/plain
File size: 4.9 KB
Line 
1package de.ugoe.cs.eventbench.jfcmonitor;
2
3import java.awt.AWTEvent;
4import java.awt.Component;
5import java.awt.event.AWTEventListener;
6import java.awt.event.FocusEvent;
7import java.awt.event.KeyEvent;
8import java.awt.event.MouseEvent;
9import java.io.IOException;
10import java.io.OutputStreamWriter;
11
12import de.ugoe.cs.util.StringTools;
13
14/**
15 * <p>
16 * This class implements monitoring of AWT and Swing mouse and keyboard events.
17 * Each of the events is written to an output stream.
18 * </p>
19 *
20 * @author Steffen Herbold
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 OutputStreamWriter outputWriter;
31
32        /**
33         * <p>
34         * Constructor. Creates a new JFCListener with a given
35         * {@link OutputStreamWriter}, where the monitored information is logged.
36         * </p>
37         *
38         * @param outputWriter
39         *            writer for the logged information
40         */
41        public JFCListener(OutputStreamWriter outputWriter) {
42                this.outputWriter = outputWriter;
43                try {
44                        outputWriter.write("<?xml version=\"1.0\" encoding=\"UTF-16\"?>"
45                                        + StringTools.ENDLINE);
46                        outputWriter.write("<sessions>" + StringTools.ENDLINE);
47                } catch (IOException e) {
48                        System.err.println("JFCMONITOR -- Failure writing to log: "
49                                        + e.getMessage());
50                }
51        }
52
53        /**
54         * <p>
55         * Writes all received {@link MouseEvent}s and {@link KeyEvent}s to the
56         * {@link #outputWriter}.
57         * </p>
58         *
59         * @see java.awt.event.AWTEventListener#eventDispatched(java.awt.AWTEvent)
60         */
61        @Override
62        public void eventDispatched(AWTEvent event) {
63                StringBuilder builder = new StringBuilder();
64
65                if (event instanceof MouseEvent) {
66                        MouseEvent mouseEvent = (MouseEvent) event;
67                        if (!isMouseMovement(event.getID())) {
68                                builder.append("<event id=\"" + event.getID() + "\">" + StringTools.ENDLINE);
69                                builder.append(" <param name=\"X\" value=\""
70                                                + mouseEvent.getX() + "\" />" + StringTools.ENDLINE);
71                                builder.append(" <param name=\"Y\" value=\""
72                                                + mouseEvent.getY() + "\" />" + StringTools.ENDLINE);
73                                builder.append(" <param name=\"Button\" value=\""
74                                                + mouseEvent.getButton() + "\" />" + StringTools.ENDLINE);
75                                builder.append(" <param name=\"Modifiers\" value=\""
76                                                + mouseEvent.getModifiers() + "\" />" + StringTools.ENDLINE);
77                                addSourceInfo(builder, event);
78                                builder.append("</event>" + StringTools.ENDLINE);
79                        }
80                }
81                if (event instanceof KeyEvent) {
82                        KeyEvent keyEvent = (KeyEvent) event;
83                        if (keyEvent.getID() == KeyEvent.KEY_TYPED) {
84                                builder.append("<event id=\"" + event.getID() + "\">" + StringTools.ENDLINE);
85                                builder.append(" <param name=\"KeyCode\" value=\""
86                                                + keyEvent.getKeyCode() + "\" />" + StringTools.ENDLINE);
87                                builder.append(" <param name=\"Modifiers\" value=\""
88                                                + keyEvent.getModifiers() + "\" />" + StringTools.ENDLINE);
89                                addSourceInfo(builder, event);
90                                builder.append("</event>" + StringTools.ENDLINE);
91                        }
92                }
93                if (event instanceof FocusEvent) {
94                        FocusEvent focusEvent = (FocusEvent) event;
95                        if( focusEvent.getID() == FocusEvent.FOCUS_GAINED ) {
96                                builder.append("<event id=\"" + event.getID() + "\">" + StringTools.ENDLINE);
97                                addSourceInfo(builder, event);
98                                builder.append("</event>" + StringTools.ENDLINE);
99                        }
100                }
101                if (builder.length() > 0 && outputWriter != null) {
102                        try {
103                                outputWriter.write(builder.toString());
104                                outputWriter.flush();
105                        } catch (IOException e) {
106                                System.err.println("JFCMONITOR -- Failure writing to log: "
107                                                + e.getMessage());
108                        }
109                }
110        }
111
112        /**
113         * <p>
114         * Appends information about the event to a {@link StringBuilder}.
115         * </p>
116         *
117         * @param builder
118         *            {@link StringBuilder} where the information is appended
119         * @param event
120         *            event whose information is appended
121         */
122        private void addSourceInfo(StringBuilder builder, AWTEvent event) {
123                builder.append(" <source>" + StringTools.ENDLINE);
124                builder.append("  <param name=\"toString\" value=\""
125                                + StringTools
126                                                .xmlEntityReplacement(event.getSource().toString())
127                                + "\" />" + StringTools.ENDLINE);
128                if (event.getSource() instanceof Component) {
129                        Component source = (Component) event.getSource();
130                        JFCComponent jfcComponent = JFCComponent.find(source);
131                        if (jfcComponent != null) {
132                                builder.append(jfcComponent.getXML());
133                        }
134                }
135                builder.append(" </source>" + StringTools.ENDLINE);
136        }
137
138        /**
139         * <p>
140         * Checks if the Id of an {@link AWTEvent} is a mouse movement Id.
141         * </p>
142         *
143         * @param eventId
144         *            id of the {@link AWTEvent}
145         * @return true, if the event is a mouse movement event; false otherwise
146         */
147        private boolean isMouseMovement(int eventId) {
148                return eventId == MouseEvent.MOUSE_MOVED
149                                || eventId == MouseEvent.MOUSE_DRAGGED
150                                || eventId == MouseEvent.MOUSE_ENTERED
151                                || eventId == MouseEvent.MOUSE_EXITED;
152        }
153
154}
Note: See TracBrowser for help on using the repository browser.