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

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