-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Labels
enhancementNew feature or requestNew feature or request
Description
Checklist
- I searched exising issues and no one else requests similar feature.
- I think that 25%+ users are positive towards this feature.
Describe the feature
运行时:连接探查器 + SWT 集成
package dev.tl.rcpinspector.agent;
List<String> roots = new ArrayList<>();
int i=0; for (Shell s : display().getShells()) {
roots.add(serializeControl(s, ""+i, 0)); i++;
}
json("{\"type\":\"tree\",\"roots\":[%s]}\n", String.join(",", roots));
}
private static String serializeControl(Control c, String id, int depth) {
if (depth>64) return "{}"; // 防御
StringBuilder sb = new StringBuilder();
Rectangle b = c.getBounds();
sb.append('{')
.append(kv("id", id)).append(',')
.append(kv("type", c.getClass().getName())).append(',')
.append(kv("classSimple", c.getClass().getSimpleName())).append(',')
.append(kv("text", tryText(c))).append(',')
.append("\"bounds\":{").append("\"x\":"+b.x+",\"y\":"+b.y+",\"w\":"+b.width+",\"h\":"+b.height+"},")
.append("\"enabled\":"+c.isEnabled()+",")
.append("\"visible\":"+c.getVisible());
if (c instanceof Composite comp) {
Control[] children = comp.getChildren();
sb.append(",\"children\":[");
for (int i=0;i<children.length;i++) {
if (i>0) sb.append(',');
sb.append(serializeControl(children[i], id+"/"+i, depth+1));
}
sb.append(']');
}
return sb.append('}').toString();
}
private static String tryText(Control c) {
try {
if (c instanceof Label lbl) return lbl.getText();
if (c instanceof Button btn) return btn.getText();
if (c instanceof Text txt) return txt.getText();
if (c instanceof CTabItem item) return item.getText();
if (c instanceof ToolItem t) return t.getText();
if (c instanceof TableItem ti) return ti.getText();
} catch (Throwable ignore) {}
return "";
}
private static void sendEvent(Event e, Control c) {
String msg = String.format(Locale.ROOT,
"{\"type\":\"%s\",\"id\":%s,\"class\":%s,\"text\":%s,\"x\":%d,\"y\":%d}\n",
e.type==SWT.FocusIn?"focus":"click",
strq(pathOf(c)), strq(c.getClass().getName()), strq(tryText(c)), e.x, e.y);
out.println(msg);
}
private static String pathOf(Control c) {
// 通过从 Shell 向下的索引路径生成稳定ID
Deque<Integer> idx = new ArrayDeque<>();
Control cur = c;
while (cur != null) {
Composite parent = cur.getParent();
if (parent == null) break;
int i=0; for (Control kid : parent.getChildren()) { if (kid==cur) break; i++; }
idx.addFirst(i);
cur = parent;
}
// locate shell index
Shell shell = c.getShell();
int sidx=0; for (Shell s : display().getShells()) { if (s==shell) break; sidx++; }
StringBuilder sb = new StringBuilder();
sb.append(sidx);
for (int i : idx) sb.append('/').append(i);
return sb.toString();
}
private static void json(String fmt, Object...args) { out.printf(Locale.ROOT, fmt, args); }
private static String strq(String s){return '"'+(s==null?"":s.replace("\\","\\\\").replace("\"","\\\"").replace("\n","\\n"))+'"';}
}Additional context
No response
Metadata
Metadata
Assignees
Labels
enhancementNew feature or requestNew feature or request