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

Last change on this file since 356 was 356, checked in by sherbold, 12 years ago
  • 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         * Writer for logging events.
27         * </p>
28         */
29        final private OutputStreamWriter outputWriter;
30
31        /**
32         * <p>
33         * Constructor. Creates a new JFCListener with a given
34         * {@link OutputStreamWriter}, where the monitored information is logged.
35         * </p>
36         *
37         * @param outputWriter
38         *            writer for the logged information
39         */
40        public JFCListener(OutputStreamWriter outputWriter) {
41                this.outputWriter = outputWriter;
42                try {
43                        outputWriter.write("<?xml version=\"1.0\" encoding=\"UTF-16\"?>"
44                                        + StringTools.ENDLINE);
45                        outputWriter.write("<sessions>" + StringTools.ENDLINE);
46                } catch (IOException e) {
47                        System.err.println("JFCMONITOR -- Failure writing to log: "
48                                        + e.getMessage());
49                }
50        }
51
52        /**
53         * <p>
54         * Writes all received {@link MouseEvent}s and {@link KeyEvent}s to the
55         * {@link #outputWriter}.
56         * </p>
57         *
58         * @see java.awt.event.AWTEventListener#eventDispatched(java.awt.AWTEvent)
59         */
60        @Override
61        public void eventDispatched(AWTEvent event) {
62                StringBuilder builder = new StringBuilder();
63
64                if (event instanceof MouseEvent) {
65                        MouseEvent mouseEvent = (MouseEvent) event;
66                        if (!isMouseMovement(event.getID())) {
67                                builder.append("<event id=\"" + event.getID() + "\">" + StringTools.ENDLINE);
68                                builder.append(" <param name=\"X\" value=\""
69                                                + mouseEvent.getX() + "\" />" + StringTools.ENDLINE);
70                                builder.append(" <param name=\"Y\" value=\""
71                                                + mouseEvent.getY() + "\" />" + StringTools.ENDLINE);
72                                builder.append(" <param name=\"Button\" value=\""
73                                                + mouseEvent.getButton() + "\" />" + StringTools.ENDLINE);
74                                builder.append(" <param name=\"Modifiers\" value=\""
75                                                + mouseEvent.getModifiers() + "\" />" + StringTools.ENDLINE);
76                                addSourceInfo(builder, event);
77                                builder.append("</event>" + StringTools.ENDLINE);
78                        }
79                }
80                if (event instanceof KeyEvent) {
81                        KeyEvent keyEvent = (KeyEvent) event;
82                        if (keyEvent.getID() == KeyEvent.KEY_TYPED) {
83                                builder.append("<event id=\"" + event.getID() + "\">" + StringTools.ENDLINE);
84                                builder.append(" <param name=\"KeyCode\" value=\""
85                                                + keyEvent.getKeyCode() + "\" />" + StringTools.ENDLINE);
86                                builder.append(" <param name=\"Modifiers\" value=\""
87                                                + keyEvent.getModifiers() + "\" />" + StringTools.ENDLINE);
88                                addSourceInfo(builder, event);
89                                builder.append("</event>" + StringTools.ENDLINE);
90                        }
91                }
92                if (builder.length() > 0 && outputWriter != null) {
93                        try {
94                                outputWriter.write(builder.toString());
95                                outputWriter.flush();
96                        } catch (IOException e) {
97                                System.err.println("JFCMONITOR -- Failure writing to log: "
98                                                + e.getMessage());
99                        }
100                }
101        }
102
103        /**
104         * <p>
105         * Appends information about the event to a {@link StringBuilder}.
106         * </p>
107         *
108         * @param builder
109         *            {@link StringBuilder} where the information is appended
110         * @param event
111         *            event whose information is appended
112         */
113        private void addSourceInfo(StringBuilder builder, AWTEvent event) {
114                builder.append(" <source>" + StringTools.ENDLINE);
115                builder.append("  <param name=\"toString\" value=\""
116                                + StringTools
117                                                .xmlEntityReplacement(event.getSource().toString())
118                                + "\" />" + StringTools.ENDLINE);
119                if (event.getSource() instanceof Component) {
120                        Component source = (Component) event.getSource();
121                        JFCComponent jfcComponent = JFCComponent.find(source);
122                        if (jfcComponent != null) {
123                                builder.append(jfcComponent.getXML());
124                        }
125                }
126                builder.append(" </source>" + StringTools.ENDLINE);
127        }
128
129        /**
130         * <p>
131         * Checks if the Id of an {@link AWTEvent} is a mouse movement Id.
132         * </p>
133         *
134         * @param eventId
135         *            id of the {@link AWTEvent}
136         * @return true, if the event is a mouse movement event; false otherwise
137         */
138        private boolean isMouseMovement(int eventId) {
139                return eventId == MouseEvent.MOUSE_MOVED
140                                || eventId == MouseEvent.MOUSE_DRAGGED
141                                || eventId == MouseEvent.MOUSE_ENTERED
142                                || eventId == MouseEvent.MOUSE_EXITED;
143        }
144
145}
Note: See TracBrowser for help on using the repository browser.