001 /*
002 * Copyright 2006 Mat Gessel <mat.gessel@gmail.com>
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
005 * use this file except in compliance with the License. You may obtain a copy of
006 * the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
012 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
013 * License for the specific language governing permissions and limitations under
014 * the License.
015 */
016 package asquare.gwt.debug.client;
017
018 import com.google.gwt.user.client.DOM;
019 import com.google.gwt.user.client.Element;
020 import com.google.gwt.user.client.Event;
021 import com.google.gwt.user.client.ui.KeyboardListenerCollection;
022 import com.google.gwt.user.client.ui.UIObject;
023
024 /**
025 * Contains debugging utility methods.
026 */
027 public class DebugUtil
028 {
029 /**
030 * Renders an event bitmask as a human readable String.
031 *
032 * @param eventMask
033 * @return a String describing the events, or "" if <code>eventMask</code> is <code>0</code>
034 */
035 public static String prettyPrintEventMask(int eventMask)
036 {
037 StringBuffer result = new StringBuffer();
038 if ((eventMask & Event.ONBLUR) != 0)
039 {
040 result.append("blur ");
041 }
042 if ((eventMask & Event.ONCHANGE) != 0)
043 {
044 result.append("change ");
045 }
046 if ((eventMask & Event.ONCLICK) != 0)
047 {
048 result.append("click ");
049 }
050 if ((eventMask & Event.ONDBLCLICK) != 0)
051 {
052 result.append("dblclick ");
053 }
054 if ((eventMask & Event.ONERROR) != 0)
055 {
056 result.append("error ");
057 }
058 if ((eventMask & Event.ONFOCUS) != 0)
059 {
060 result.append("focus ");
061 }
062 if ((eventMask & Event.ONKEYDOWN) != 0)
063 {
064 result.append("keydown ");
065 }
066 if ((eventMask & Event.ONKEYPRESS) != 0)
067 {
068 result.append("keypress ");
069 }
070 if ((eventMask & Event.ONKEYUP) != 0)
071 {
072 result.append("keyup ");
073 }
074 if ((eventMask & Event.ONLOAD) != 0)
075 {
076 result.append("load ");
077 }
078 if ((eventMask & Event.ONLOSECAPTURE) != 0)
079 {
080 result.append("losecapture ");
081 }
082 if ((eventMask & Event.ONMOUSEDOWN) != 0)
083 {
084 result.append("mousedown ");
085 }
086 if ((eventMask & Event.ONMOUSEMOVE) != 0)
087 {
088 result.append("mousemove ");
089 }
090 if ((eventMask & Event.ONMOUSEOUT) != 0)
091 {
092 result.append("mouseout ");
093 }
094 if ((eventMask & Event.ONMOUSEOVER) != 0)
095 {
096 result.append("mouseover ");
097 }
098 if ((eventMask & Event.ONMOUSEUP) != 0)
099 {
100 result.append("mouseup ");
101 }
102 if ((eventMask & Event.ONSCROLL) != 0)
103 {
104 result.append("scroll ");
105 }
106 return result.toString();
107 }
108
109 /**
110 * Creates a human readable String describing the specified event.
111 *
112 * @param event an {@link Event}
113 * @return a String describing the <code>event</code>, or
114 * <code>"null"</code> if <code>event</code> is null
115 */
116 public static String prettyPrintEvent(Event event)
117 {
118 String result = String.valueOf((Object) null);
119
120 int eventType = DOM.eventGetType(event);
121 switch(eventType)
122 {
123 case Event.ONKEYDOWN:
124 result = "event[type=onKeyDown," + createKeyString(event) + "]";
125 break;
126
127 case Event.ONKEYUP:
128 result = "event[type=onKeyUp," + createKeyString(event) + "]";
129 break;
130
131 case Event.ONKEYPRESS:
132 result = "event[type=onKeyPress," + createKeyString(event) + "]";
133 break;
134
135 case Event.ONCHANGE:
136 result = "event[type=onChange,element=" + getTagName(DOM.eventGetTarget(event)) + "]";
137 break;
138
139 case Event.ONFOCUS:
140 result = "event[type=onFocus,element=" + getTagName(DOM.eventGetTarget(event)) + "]";
141 break;
142
143 case Event.ONBLUR:
144 result = "event[type=onBlur,element=" + getTagName(DOM.eventGetTarget(event)) + "]";
145 break;
146
147 case Event.ONCLICK:
148 result = "event[type=onClick,element=" + getTagName(DOM.eventGetTarget(event)) + "]";
149 break;
150
151 case Event.ONDBLCLICK:
152 result = "event[type=onDblClick,element=" + getTagName(DOM.eventGetTarget(event)) + "]";
153 break;
154
155 case Event.ONERROR:
156 result = "event[type=onError,element=" + getTagName(DOM.eventGetTarget(event)) + "]";
157 break;
158
159 case Event.ONLOAD:
160 result = "event[type=onLoad,element=" + getTagName(DOM.eventGetTarget(event)) + "]";
161 break;
162
163 case Event.ONLOSECAPTURE:
164 result = "event[type=onLoseCapture,element=" + getTagName(DOM.eventGetTarget(event)) + "]";
165 break;
166
167 case Event.ONMOUSEDOWN:
168 result = "event[type=onMouseDown," + createMouseString(event) + "]";
169 break;
170
171 case Event.ONMOUSEUP:
172 result = "event[type=onMouseUp," + createMouseString(event) + "]";
173 break;
174
175 case Event.ONMOUSEOVER:
176 result = "event[type=onMouseOver," + createMouseString(event) + "]";
177 break;
178
179 case Event.ONMOUSEOUT:
180 result = "event[type=onMouseOut," + createMouseString(event) + "]";
181 break;
182
183 case Event.ONMOUSEMOVE:
184 result = "event[type=onMouseMove," + createMouseString(event) + "]";
185 break;
186
187 case Event.ONSCROLL:
188 result = "event[type=onScroll,element=" + getTagName(DOM.eventGetTarget(event)) + "]";
189 break;
190
191 default:
192 result = DOM.eventToString(event);
193 }
194
195 return result;
196 }
197
198 private static String createKeyString(Event event)
199 {
200 return
201 "element=" + getTagName(DOM.eventGetTarget(event)) +
202 ",char=" + (char) DOM.eventGetKeyCode(event) +
203 ",keyCode=" + (int) DOM.eventGetKeyCode(event) +
204 ",modifiers=" + KeyboardListenerCollection.getKeyboardModifiers(event);
205 }
206
207 private static String createMouseString(Event event)
208 {
209 return
210 "clientX=" + DOM.eventGetClientX(event) +
211 ",clientY=" + DOM.eventGetClientY(event) +
212 ",screenX=" + DOM.eventGetScreenX(event) +
213 ",screenY=" + DOM.eventGetScreenY(event) +
214 ",buttons=" + DOM.eventGetButton(event) +
215 ",target=" + getTagName(DOM.eventGetTarget(event));
216 }
217
218 /**
219 * Get the HTML tag name.
220 *
221 * @param element a DOM element
222 * @return the value of the tagName property, or null if
223 * <code>element</code> is null
224 */
225 public static native String getTagName(Element element) /*-{
226 return element ? element.tagName : null;
227 }-*/;
228
229 /**
230 * Get the HTML tag name of the specified UIObject's element.
231 *
232 * @param uio a UIObject
233 * @return the value of the tagName property, or <code>null</code> if
234 * <code>uio</code> is null.
235 */
236 public static String getTagName(UIObject uio)
237 {
238 return getTagName((uio != null) ? uio.getElement() : null);
239 }
240
241 /**
242 * Get a short description of the element.
243 *
244 * @param element a DOM element or <code>null</code>
245 * @return a String or <code>null</code> if <code>element</code> is null
246 */
247 public static String prettyPrintElement(Element element)
248 {
249 String tagName = getTagName(element);
250 String id = DOM.getAttribute(element, "id");
251 String classNames = DOM.getAttribute(element, "className");
252 String description = null;
253
254 if ("div".equalsIgnoreCase(tagName) || "span".equalsIgnoreCase(tagName))
255 {
256 if (id != null && ! "".equals(id))
257 {
258 description = id;
259 }
260 else if (classNames != null && ! "".equals(classNames))
261 {
262 description = classNames;
263 }
264 }
265 else if (tagName.equalsIgnoreCase("button"))
266 {
267 description = DOM.getAttribute(element, "value");
268 }
269
270 return (description == null) ? tagName : tagName + "[" + description + "]";
271 }
272 }