/*******************************************************************************
* Copyright (c) 2006-2013 The RCP Company and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* The RCP Company - initial API and implementation
*******************************************************************************/
package com.rcpcompany.utils.basic.ui;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Layout;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Widget;
/**
* This utility class provides a number of static functions that can ease
* formatting of data.
*
* @author Tonny Madsen, The RCP Company
*/
public final class TSSWTUtils {
private static final String[] EVENT_TYPE_NAMES = {
"None", "KeyDown", "KeyUp", "MouseDown", "MouseUp", "MouseMove", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$
"MouseEnter", "MouseExit", "MouseDoubleClick", "Paint", "Move", "Resize", "Dispose", "Selection", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
"DefaultSelection", "FocusIn", "FocusOut", "Expand", "Collapse", "Iconify", "Deiconify", "Close", "Show", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$
"Hide", "Modify", "Verify", "Activate", "Deactivate", "Help", "DragDetect", "Arm", "Traverse", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$
"MouseHover", "HardKeyDown", "HardKeyUp", "MenuDetect", "SetData", "MouseWheel", "<unassigned>", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$
"Settings", "EraseItem", "MeasureItem", "PaintItem",
"ImeComposition", "OrientationChange", "Skin", "OpenDocument" }; //$NON-NLS-1$ //$NON-NLS-2$
/**
* Returns a multi-line description of the specific Event.
*
* @param event
* the event
* @return the description
*/
public static String toString(Event event) {
if (event == null)
return "<null>"; //$NON-NLS-1$
final StringBuilder sb = new StringBuilder();
sb.append(
event.type < EVENT_TYPE_NAMES.length ? EVENT_TYPE_NAMES[event.type]
: "...").append("[").append(event.type) //$NON-NLS-1$
.append("] hc=" + event.hashCode() + ": "); //$NON-NLS-1$ //$NON-NLS-2$
if (event.widget == null) {
sb.append("<null widget>"); //$NON-NLS-1$
} else {
sb.append(event.widget.toString())
.append(" [").append(event.widget.hashCode()).append("]"); //$NON-NLS-1$ //$NON-NLS-2$
}
sb.append("\n x=").append(event.x).append(", y=").append(event.y).append(", doit=").append(event.doit); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
final GC gc = event.gc;
switch (event.type) {
case SWT.KeyDown:
case SWT.KeyUp:
sb.append("\n "); //$NON-NLS-1$
toStringKey(sb, event.keyCode, event.stateMask, event.character);
break;
case SWT.MouseDown:
case SWT.MouseUp:
case SWT.MouseMove:
case SWT.MouseEnter:
case SWT.MouseExit:
case SWT.MouseDoubleClick:
case SWT.MouseHover:
case SWT.MouseWheel:
toStringStateMask(sb, event);
sb.append("button=").append(event.button).append(", count=").append(event.count); //$NON-NLS-1$ //$NON-NLS-2$
break;
case SWT.Paint:
sb.append("\n gc=").append(gc).append(", clipping=").append(gc.getClipping()).append(", width=").append(event.width).append(", height=") //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
.append(event.height)
.append(", count=").append(event.count); //$NON-NLS-1$
break;
case SWT.Move:
case SWT.Resize:
break;
case SWT.Dispose:
break;
case SWT.Selection:
case SWT.DefaultSelection:
toStringStateMask(sb, event);
sb.append("width=").append(event.width).append(", height=").append(event.height).append(", detail="); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
if ((event.detail & SWT.CHECK) == SWT.CHECK) {
sb.append("CHECK "); //$NON-NLS-1$
}
sb.append(event.detail)
.append(", text='").append(event.text).append("'"); //$NON-NLS-1$ //$NON-NLS-2$
break;
case SWT.FocusIn:
case SWT.FocusOut:
break;
case SWT.Expand:
case SWT.Collapse:
case SWT.Iconify:
case SWT.Deiconify:
// TODO
break;
case SWT.Close:
case SWT.Show:
case SWT.Hide:
// TODO
break;
case SWT.Modify:
// TODO
break;
case SWT.Verify:
sb.append("\n "); //$NON-NLS-1$
sb.append("[").append(event.start).append("; ").append(event.end).append("[='").append(event.text) //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
.append("'"); //$NON-NLS-1$
break;
case SWT.Activate:
case SWT.Deactivate:
// TODO
break;
case SWT.Help:
// TODO
break;
case SWT.DragDetect:
// TODO
break;
case SWT.Arm:
// TODO
break;
case SWT.Traverse:
sb.append("\n "); //$NON-NLS-1$
if ((event.detail & SWT.TRAVERSE_ESCAPE) == SWT.TRAVERSE_ESCAPE) {
sb.append("Escape"); //$NON-NLS-1$
}
if ((event.detail & SWT.TRAVERSE_RETURN) == SWT.TRAVERSE_RETURN) {
sb.append("RETURN"); //$NON-NLS-1$
}
if ((event.detail & SWT.TRAVERSE_TAB_PREVIOUS) == SWT.TRAVERSE_TAB_PREVIOUS) {
sb.append("TAB PREVIOUS"); //$NON-NLS-1$
}
if ((event.detail & SWT.TRAVERSE_TAB_NEXT) == SWT.TRAVERSE_TAB_NEXT) {
sb.append("TAB NEXT"); //$NON-NLS-1$
}
if ((event.detail & SWT.TRAVERSE_ARROW_PREVIOUS) == SWT.TRAVERSE_ARROW_PREVIOUS) {
sb.append("ARROW PREVIOUS"); //$NON-NLS-1$
}
if ((event.detail & SWT.TRAVERSE_ARROW_NEXT) == SWT.TRAVERSE_ARROW_NEXT) {
sb.append("ARROW NEXT"); //$NON-NLS-1$
}
if ((event.detail & SWT.TRAVERSE_MNEMONIC) == SWT.TRAVERSE_MNEMONIC) {
sb.append("MNEMONIC"); //$NON-NLS-1$
}
if ((event.detail & SWT.TRAVERSE_PAGE_PREVIOUS) == SWT.TRAVERSE_PAGE_PREVIOUS) {
sb.append("PAGE PREVIOUS"); //$NON-NLS-1$
}
if ((event.detail & SWT.TRAVERSE_PAGE_NEXT) == SWT.TRAVERSE_PAGE_NEXT) {
sb.append("PAGE NEXT"); //$NON-NLS-1$
}
break;
case SWT.HardKeyDown:
case SWT.HardKeyUp:
// TODO
break;
case SWT.MenuDetect:
// TODO
break;
case SWT.SetData:
// TODO
break;
case SWT.Settings:
// TODO
break;
case SWT.EraseItem:
case SWT.MeasureItem:
sb.append("\n gc=").append(gc).append(", index(column)=").append(event.index).append(", width=") //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
.append(event.width)
.append(", height=").append(event.height).append(", count=") //$NON-NLS-1$ //$NON-NLS-2$
.append(event.count);
break;
case SWT.PaintItem: {
sb.append("\n gc=").append(gc).append(", index(column)=").append(event.index).append(", width=") //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
.append(event.width)
.append(", height=").append(event.height).append(", count=") //$NON-NLS-1$ //$NON-NLS-2$
.append(event.count).append(", detail="); //$NON-NLS-1$
int d = event.detail;
if ((d & SWT.DRAG) == SWT.DRAG) {
sb.append("DRAG+"); //$NON-NLS-1$
d &= ~SWT.DRAG;
}
if ((d & SWT.FOCUSED) == SWT.FOCUSED) {
sb.append("FOCUSED+"); //$NON-NLS-1$
d &= ~SWT.FOCUSED;
}
if ((d & SWT.SELECTED) == SWT.SELECTED) {
sb.append("SELECTED+"); //$NON-NLS-1$
d &= ~SWT.SELECTED;
}
if ((d & SWT.BACKGROUND) == SWT.BACKGROUND) {
sb.append("BACKGROUND+"); //$NON-NLS-1$
d &= ~SWT.BACKGROUND;
}
if ((d & SWT.FOREGROUND) == SWT.FOREGROUND) {
sb.append("FOREGROUND+"); //$NON-NLS-1$
d &= ~SWT.FOREGROUND;
}
if ((d & SWT.HOT) == SWT.HOT) {
sb.append("HOT+"); //$NON-NLS-1$
d &= ~SWT.HOT;
}
if (d == 0 && event.detail != 0) {
sb.deleteCharAt(sb.length() - 1);
} else {
sb.append(d);
}
break;
}
case SWT.ImeComposition: {
sb.append("\n "); //$NON-NLS-1$
sb.append("[").append(event.start).append("; ").append(event.end).append("[='").append(event.text) //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
.append("'").append(", detail="); //$NON-NLS-1$
int d = event.detail;
if ((d & SWT.COMPOSITION_CHANGED) == SWT.COMPOSITION_CHANGED) {
sb.append("CHANGED+"); //$NON-NLS-1$
d &= ~SWT.COMPOSITION_CHANGED;
}
if ((d & SWT.COMPOSITION_OFFSET) == SWT.COMPOSITION_OFFSET) {
sb.append("OFFSET+"); //$NON-NLS-1$
d &= ~SWT.COMPOSITION_OFFSET;
}
if ((d & SWT.COMPOSITION_SELECTION) == SWT.COMPOSITION_SELECTION) {
sb.append("SELECTION+"); //$NON-NLS-1$
d &= ~SWT.COMPOSITION_SELECTION;
}
if (d == 0 && event.detail != 0) {
sb.deleteCharAt(sb.length() - 1);
} else {
sb.append(d);
}
break;
}
case SWT.OrientationChange:
// TODO
break;
case SWT.Skin:
// TODO
break;
case SWT.OpenDocument:
// TODO
break;
default:
// TODO
break;
}
if (event.item != null) {
final Widget item = event.item;
sb.append("\n "); //$NON-NLS-1$
sb.append("item=").append(item).append(" [data=").append(item.getData()); //$NON-NLS-1$ //$NON-NLS-2$
if (item instanceof TableItem) {
final TableItem ti = (TableItem) item;
sb.append(", text=").append(ti.getText()); //$NON-NLS-1$
}
sb.append("]"); //$NON-NLS-1$
}
return sb.toString();
}
private static void toStringStateMask(final StringBuilder sb, Event event) {
sb.append("\n "); //$NON-NLS-1$
if ((event.stateMask & SWT.ALT) == SWT.ALT) {
sb.append("ALT "); //$NON-NLS-1$
}
if ((event.stateMask & SWT.SHIFT) == SWT.SHIFT) {
sb.append("SHIFT "); //$NON-NLS-1$
}
if ((event.stateMask & SWT.CTRL) == SWT.CTRL) {
sb.append("CTRL "); //$NON-NLS-1$
}
if ((event.stateMask & SWT.COMMAND) == SWT.COMMAND) {
sb.append("COMMAND "); //$NON-NLS-1$
}
if ((event.stateMask & SWT.MOD1) == SWT.MOD1) {
sb.append("MOD1 "); //$NON-NLS-1$
}
if ((event.stateMask & SWT.MOD2) == SWT.MOD2) {
sb.append("MOD2 "); //$NON-NLS-1$
}
if ((event.stateMask & SWT.MOD3) == SWT.MOD3) {
sb.append("MOD3 "); //$NON-NLS-1$
}
if ((event.stateMask & SWT.MOD4) == SWT.MOD4) {
sb.append("MOD4 "); //$NON-NLS-1$
}
if ((event.stateMask & SWT.BUTTON1) == SWT.BUTTON1) {
sb.append("BUTTON1 "); //$NON-NLS-1$
}
if ((event.stateMask & SWT.BUTTON2) == SWT.BUTTON2) {
sb.append("BUTTON2 "); //$NON-NLS-1$
}
if ((event.stateMask & SWT.BUTTON3) == SWT.BUTTON3) {
sb.append("BUTTON3 "); //$NON-NLS-1$
}
if ((event.stateMask & SWT.BUTTON4) == SWT.BUTTON4) {
sb.append("BUTTON4 "); //$NON-NLS-1$
}
if ((event.stateMask & SWT.BUTTON5) == SWT.BUTTON5) {
sb.append("BUTTON5 "); //$NON-NLS-1$
}
}
/**
* Returns a multi-line description of the specific Event.
*
* @param event
* the event
* @return the description
*/
public static String toString(KeyEvent event) {
final StringBuilder sb = new StringBuilder();
if (event == null)
return "<null>"; //$NON-NLS-1$
toStringKey(sb, event.keyCode, event.stateMask, event.character);
return sb.toString();
}
private static void toStringKey(final StringBuilder sb, int keyCode,
int stateMask, char character) {
if ((stateMask & SWT.ALT) == SWT.ALT) {
sb.append("ALT "); //$NON-NLS-1$
}
if ((stateMask & SWT.SHIFT) == SWT.SHIFT) {
sb.append("SHIFT "); //$NON-NLS-1$
}
if ((stateMask & SWT.CTRL) == SWT.CTRL) {
sb.append("CTRL "); //$NON-NLS-1$
}
if ((stateMask & SWT.COMMAND) == SWT.COMMAND) {
sb.append("COMMAND "); //$NON-NLS-1$
}
if ((stateMask & SWT.BUTTON1) == SWT.BUTTON1) {
sb.append("BUTTON1 "); //$NON-NLS-1$
}
if ((stateMask & SWT.BUTTON2) == SWT.BUTTON2) {
sb.append("BUTTON2 "); //$NON-NLS-1$
}
if ((stateMask & SWT.BUTTON3) == SWT.BUTTON3) {
sb.append("BUTTON3 "); //$NON-NLS-1$
}
if ((stateMask & SWT.BUTTON4) == SWT.BUTTON4) {
sb.append("BUTTON4 "); //$NON-NLS-1$
}
if ((stateMask & SWT.BUTTON5) == SWT.BUTTON5) {
sb.append("BUTTON5 "); //$NON-NLS-1$
}
sb.append("character="); //$NON-NLS-1$
if (Character.isISOControl(character)) {
sb.append((int) character);
} else {
sb.append("'").append(character).append("'"); //$NON-NLS-1$ //$NON-NLS-2$
}
sb.append(", keyCode="); //$NON-NLS-1$
switch (keyCode) {
case SWT.ARROW_UP:
sb.append("ARROW_UP"); //$NON-NLS-1$
break;
case SWT.ARROW_DOWN:
sb.append("ARROW_DOWN"); //$NON-NLS-1$
break;
case SWT.ARROW_LEFT:
sb.append("ARROW_LEFT"); //$NON-NLS-1$
break;
case SWT.ARROW_RIGHT:
sb.append("ARROW_RIGHT"); //$NON-NLS-1$
break;
case SWT.PAGE_UP:
sb.append("PAGE_UP"); //$NON-NLS-1$
break;
case SWT.PAGE_DOWN:
sb.append("PAGE_DOWN"); //$NON-NLS-1$
break;
case SWT.HOME:
sb.append("HOME"); //$NON-NLS-1$
break;
case SWT.END:
sb.append("END"); //$NON-NLS-1$
break;
case SWT.INSERT:
sb.append("INSERT"); //$NON-NLS-1$
break;
case SWT.F1:
sb.append("F1"); //$NON-NLS-1$
break;
case SWT.F2:
sb.append("F2"); //$NON-NLS-1$
break;
case SWT.F3:
sb.append("F3"); //$NON-NLS-1$
break;
case SWT.F4:
sb.append("F4"); //$NON-NLS-1$
break;
case SWT.F5:
sb.append("F5"); //$NON-NLS-1$
break;
case SWT.F6:
sb.append("F6"); //$NON-NLS-1$
break;
case SWT.F7:
sb.append("F7"); //$NON-NLS-1$
break;
case SWT.F8:
sb.append("F8"); //$NON-NLS-1$
break;
case SWT.F9:
sb.append("F9"); //$NON-NLS-1$
break;
case SWT.F10:
sb.append("F10"); //$NON-NLS-1$
break;
case SWT.F11:
sb.append("F11"); //$NON-NLS-1$
break;
case SWT.F12:
sb.append("F12"); //$NON-NLS-1$
break;
case SWT.F13:
sb.append("F13"); //$NON-NLS-1$
break;
case SWT.F14:
sb.append("F14"); //$NON-NLS-1$
break;
case SWT.F15:
sb.append("F15"); //$NON-NLS-1$
break;
case SWT.KEYPAD_MULTIPLY:
sb.append("KEYPAD_MULTIPLY"); //$NON-NLS-1$
break;
case SWT.KEYPAD_ADD:
sb.append("KEYPAD_ADD"); //$NON-NLS-1$
break;
case SWT.KEYPAD_SUBTRACT:
sb.append("KEYPAD_SUBTRACT"); //$NON-NLS-1$
break;
case SWT.KEYPAD_DECIMAL:
sb.append("KEYPAD_DECIMAL"); //$NON-NLS-1$
break;
case SWT.KEYPAD_DIVIDE:
sb.append("KEYPAD_DIVIDE"); //$NON-NLS-1$
break;
case SWT.KEYPAD_0:
sb.append("KEYPAD_0"); //$NON-NLS-1$
break;
case SWT.KEYPAD_1:
sb.append("KEYPAD_1"); //$NON-NLS-1$
break;
case SWT.KEYPAD_2:
sb.append("KEYPAD_2"); //$NON-NLS-1$
break;
case SWT.KEYPAD_3:
sb.append("KEYPAD_3"); //$NON-NLS-1$
break;
case SWT.KEYPAD_4:
sb.append("KEYPAD_4"); //$NON-NLS-1$
break;
case SWT.KEYPAD_5:
sb.append("KEYPAD_5"); //$NON-NLS-1$
break;
case SWT.KEYPAD_6:
sb.append("KEYPAD_6"); //$NON-NLS-1$
break;
case SWT.KEYPAD_7:
sb.append("KEYPAD_7"); //$NON-NLS-1$
break;
case SWT.KEYPAD_8:
sb.append("KEYPAD_8"); //$NON-NLS-1$
break;
case SWT.KEYPAD_9:
sb.append("KEYPAD_9"); //$NON-NLS-1$
break;
case SWT.KEYPAD_EQUAL:
sb.append("KEYPAD_EQUAL"); //$NON-NLS-1$
break;
case SWT.KEYPAD_CR:
sb.append("KEYPAD_CR"); //$NON-NLS-1$
break;
case SWT.HELP:
sb.append("HELP"); //$NON-NLS-1$
break;
case SWT.CAPS_LOCK:
sb.append("CAPS_LOCK"); //$NON-NLS-1$
break;
case SWT.NUM_LOCK:
sb.append("NUM_LOCK"); //$NON-NLS-1$
break;
case SWT.SCROLL_LOCK:
sb.append("SCROLL_LOCK"); //$NON-NLS-1$
break;
case SWT.PAUSE:
sb.append("PAUSE"); //$NON-NLS-1$
break;
case SWT.BREAK:
sb.append("BREAK"); //$NON-NLS-1$
break;
case SWT.PRINT_SCREEN:
sb.append("PRINT_SCREEN"); //$NON-NLS-1$
break;
case SWT.ALT:
sb.append("ALT"); //$NON-NLS-1$
break;
case SWT.SHIFT:
sb.append("SHIFT"); //$NON-NLS-1$
break;
case SWT.CTRL:
sb.append("CTRL"); //$NON-NLS-1$
break;
case SWT.COMMAND:
sb.append("COMMAND"); //$NON-NLS-1$
break;
case SWT.BUTTON1:
sb.append("BUTTON1"); //$NON-NLS-1$
break;
case SWT.BUTTON2:
sb.append("BUTTON2"); //$NON-NLS-1$
break;
case SWT.BUTTON3:
sb.append("BUTTON3"); //$NON-NLS-1$
break;
case SWT.BUTTON4:
sb.append("BUTTON4"); //$NON-NLS-1$
break;
case SWT.BUTTON5:
sb.append("BUTTON5"); //$NON-NLS-1$
break;
default:
if ((keyCode & SWT.KEYCODE_BIT) == SWT.KEYCODE_BIT) {
sb.append("KEYCODE_BIT+").append(keyCode & SWT.KEY_MASK); //$NON-NLS-1$
} else {
sb.append(keyCode);
}
break;
}
/*
* Add a MODx suffix for the state mask stuff..
*/
if (keyCode == SWT.MOD1) {
sb.append("[MOD1]"); //$NON-NLS-1$
} else if (keyCode == SWT.MOD2) {
sb.append("[MOD2]"); //$NON-NLS-1$
} else if (keyCode == SWT.MOD3) {
sb.append("[MOD3]"); //$NON-NLS-1$
} else if (keyCode == SWT.MOD4) {
sb.append("[MOD4]"); //$NON-NLS-1$
}
}
public String toString(Layout layout) {
final StringBuilder sb = new StringBuilder();
return sb.toString();
}
/**
* Returns a description of the path of the specified control.
*
* @param c
* the control to return the path for
* @return the path
*/
public static String toPath(Control c) {
String s = null;
while (c != null) {
if (s != null) {
s = " > " + s; //$NON-NLS-1$
} else {
s = ""; //$NON-NLS-1$
}
s = c + "@" + System.identityHashCode(c) + s; //$NON-NLS-1$
if (c.isDisposed()) {
s += " DISPOSED";
break;
}
c = c.getParent();
}
return s;
}
}