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    }