|
33 | 33 | import java.util.stream.Stream;
|
34 | 34 | import javax.annotation.Nullable;
|
35 | 35 | import org.eclipse.swt.SWT;
|
| 36 | +import org.eclipse.swt.dnd.DND; |
| 37 | +import org.eclipse.swt.dnd.DropTargetEvent; |
| 38 | +import org.eclipse.swt.dnd.DropTargetListener; |
36 | 39 | import org.eclipse.swt.widgets.Event;
|
37 | 40 | import org.eclipse.swt.widgets.Widget;
|
38 | 41 |
|
39 | 42 | /**
|
40 | 43 | * Helpful utilities for debugging SWT.
|
41 | 44 | */
|
42 | 45 | public class SwtDebug {
|
| 46 | + /** Dumps the given SWT event to System.out. */ |
| 47 | + public static void dumpEvent(String name, @Nullable DropTargetEvent e) { |
| 48 | + dumpEvent(name, e, StringPrinter.systemOut()); |
| 49 | + } |
| 50 | + |
| 51 | + /** Dumps the given SWT event to the given StringPrinter. */ |
| 52 | + public static void dumpEvent(String name, @Nullable DropTargetEvent e, StringPrinter to) { |
| 53 | + if (e == null) { |
| 54 | + to.println(name + ": null"); |
| 55 | + return; |
| 56 | + } |
| 57 | + to.println(name + " (x, y): " + e.x + ", " + e.y); |
| 58 | + if (e.data != null) { |
| 59 | + to.println("\tdata: " + e.data); |
| 60 | + } |
| 61 | + if (e.item != null) { |
| 62 | + to.println("\titem: " + e.item); |
| 63 | + } |
| 64 | + if (e.currentDataType != null) { |
| 65 | + to.println("\tcurrentDataType: " + e.currentDataType); |
| 66 | + } |
| 67 | + if (e.dataTypes != null) { |
| 68 | + to.println("\tdataTypes: " + Arrays.asList(e.dataTypes)); |
| 69 | + } |
| 70 | + to.println("\tdetail: " + Flag.toString(Detail.class, e.detail)); |
| 71 | + to.println("\toperations: " + Flag.toString(Detail.class, e.operations)); |
| 72 | + to.println("\tfeedback: " + Flag.toString(Feedback.class, e.feedback)); |
| 73 | + } |
| 74 | + |
| 75 | + /** A DropTargetListener which dumps events. */ |
| 76 | + public static DropTargetListener dumpEventsDropListener() { |
| 77 | + return new DropTargetListener() { |
| 78 | + @Override |
| 79 | + public void dragEnter(DropTargetEvent event) { |
| 80 | + SwtDebug.dumpEvent("dragEnter", event); |
| 81 | + } |
| 82 | + |
| 83 | + @Override |
| 84 | + public void dragLeave(DropTargetEvent event) { |
| 85 | + SwtDebug.dumpEvent("dragLeave", event); |
| 86 | + } |
| 87 | + |
| 88 | + @Override |
| 89 | + public void dragOperationChanged(DropTargetEvent event) { |
| 90 | + SwtDebug.dumpEvent("dragOperationChanged", event); |
| 91 | + } |
| 92 | + |
| 93 | + @Override |
| 94 | + public void dragOver(DropTargetEvent event) { |
| 95 | + SwtDebug.dumpEvent("dragOver", event); |
| 96 | + } |
| 97 | + |
| 98 | + @Override |
| 99 | + public void drop(DropTargetEvent event) { |
| 100 | + SwtDebug.dumpEvent("drop", event); |
| 101 | + } |
| 102 | + |
| 103 | + @Override |
| 104 | + public void dropAccept(DropTargetEvent event) { |
| 105 | + SwtDebug.dumpEvent("dropAccept", event); |
| 106 | + } |
| 107 | + }; |
| 108 | + } |
| 109 | + |
| 110 | + interface Flag<T extends Enum<T>> { |
| 111 | + int flag(); |
| 112 | + |
| 113 | + static String toString(Class<? extends Enum<?>> clazz, int flag) { |
| 114 | + Enum<?>[] flags = clazz.getEnumConstants(); |
| 115 | + if (flag == 0) { |
| 116 | + return flags[0].name(); |
| 117 | + } |
| 118 | + return Arrays.stream(flags).skip(1) |
| 119 | + .filter(flagValue -> { |
| 120 | + int flagBit = ((Flag<?>) flagValue).flag(); |
| 121 | + return (flagBit & flag) == flagBit; |
| 122 | + }) |
| 123 | + .map(Enum::name) |
| 124 | + .collect(Collectors.joining(" | ")); |
| 125 | + } |
| 126 | + } |
| 127 | + |
| 128 | + enum Detail implements Flag<Detail> { |
| 129 | + DROP_NONE(DND.DROP_NONE), DROP_MOVE(DND.DROP_MOVE), DROP_COPY(DND.DROP_COPY), DROP_LINK(DND.DROP_LINK), DROP_TARGET_MOVE(DND.DROP_TARGET_MOVE), DROP_DEFAULT(DND.DROP_DEFAULT); |
| 130 | + |
| 131 | + private final int flag; |
| 132 | + |
| 133 | + Detail(int flag) { |
| 134 | + this.flag = flag; |
| 135 | + } |
| 136 | + |
| 137 | + @Override |
| 138 | + public int flag() { |
| 139 | + return flag; |
| 140 | + } |
| 141 | + } |
| 142 | + |
| 143 | + enum Feedback implements Flag<Feedback> { |
| 144 | + FEEDBACK_NONE(DND.FEEDBACK_NONE), FEEDBACK_SELECT(DND.FEEDBACK_SELECT), FEEDBACK_INSERT_BEFORE(DND.FEEDBACK_INSERT_BEFORE), FEEDBACK_INSERT_AFTER(DND.FEEDBACK_INSERT_AFTER), FEEDBACK_SCROLL(DND.FEEDBACK_SCROLL), FEEDBACK_EXPAND(DND.FEEDBACK_EXPAND); |
| 145 | + |
| 146 | + private final int flag; |
| 147 | + |
| 148 | + Feedback(int flag) { |
| 149 | + this.flag = flag; |
| 150 | + } |
| 151 | + |
| 152 | + @Override |
| 153 | + public int flag() { |
| 154 | + return flag; |
| 155 | + } |
| 156 | + } |
| 157 | + |
43 | 158 | /** Dumps the given SWT event to System.out. */
|
44 | 159 | public static void dumpEvent(String name, @Nullable Event e) {
|
45 | 160 | dumpEvent(name, e, StringPrinter.systemOut());
|
|
0 commit comments