| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,138 @@ | |||
| 1 | + package processing.mode.java.pdex; | ||
| 2 | + | ||
| 3 | + import java.awt.EventQueue; | ||
| 4 | + import java.awt.Rectangle; | ||
| 5 | + import java.awt.event.ComponentAdapter; | ||
| 6 | + import java.awt.event.ComponentEvent; | ||
| 7 | + import java.util.ArrayDeque; | ||
| 8 | + import java.util.Deque; | ||
| 9 | + import java.util.function.Consumer; | ||
| 10 | + | ||
| 11 | + import javax.swing.JDialog; | ||
| 12 | + import javax.swing.JFrame; | ||
| 13 | + import javax.swing.JScrollPane; | ||
| 14 | + import javax.swing.JTree; | ||
| 15 | + import javax.swing.tree.DefaultMutableTreeNode; | ||
| 16 | + import javax.swing.tree.DefaultTreeModel; | ||
| 17 | + | ||
| 18 | + import org.eclipse.jdt.core.dom.ASTNode; | ||
| 19 | + import org.eclipse.jdt.core.dom.ASTVisitor; | ||
| 20 | + import org.eclipse.jdt.core.dom.CompilationUnit; | ||
| 21 | + | ||
| 22 | + import processing.app.Messages; | ||
| 23 | + import processing.app.ui.ZoomTreeCellRenderer; | ||
| 24 | + import processing.mode.java.JavaEditor; | ||
| 25 | + import processing.mode.java.pdex.PreprocessedSketch.SketchInterval; | ||
| 26 | + | ||
| 27 | + class DebugTree { | ||
| 28 | + final JDialog window; | ||
| 29 | + final JTree tree; | ||
| 30 | + final Consumer<PreprocessedSketch> updateListener; | ||
| 31 | + | ||
| 32 | + | ||
| 33 | + DebugTree(JavaEditor editor, PreprocessingService pps) { | ||
| 34 | + updateListener = this::buildAndUpdateTree; | ||
| 35 | + | ||
| 36 | + window = new JDialog(editor); | ||
| 37 | + | ||
| 38 | + tree = new JTree() { | ||
| 39 | + @Override | ||
| 40 | + public String convertValueToText(Object value, boolean selected, | ||
| 41 | + boolean expanded, boolean leaf, | ||
| 42 | + int row, boolean hasFocus) { | ||
| 43 | + if (value instanceof DefaultMutableTreeNode) { | ||
| 44 | + DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode) value; | ||
| 45 | + Object o = treeNode.getUserObject(); | ||
| 46 | + if (o instanceof ASTNode) { | ||
| 47 | + ASTNode node = (ASTNode) o; | ||
| 48 | + return CompletionGenerator.getNodeAsString(node); | ||
| 49 | + } | ||
| 50 | + } | ||
| 51 | + return super.convertValueToText(value, selected, expanded, leaf, row, hasFocus); | ||
| 52 | + } | ||
| 53 | + }; | ||
| 54 | + tree.setCellRenderer(new ZoomTreeCellRenderer(editor.getMode())); | ||
| 55 | + window.addComponentListener(new ComponentAdapter() { | ||
| 56 | + @Override | ||
| 57 | + public void componentHidden(ComponentEvent e) { | ||
| 58 | + pps.unregisterListener(updateListener); | ||
| 59 | + tree.setModel(null); | ||
| 60 | + } | ||
| 61 | + }); | ||
| 62 | + window.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); | ||
| 63 | + window.setBounds(new Rectangle(680, 100, 460, 620)); | ||
| 64 | + window.setTitle("AST View - " + editor.getSketch().getName()); | ||
| 65 | + JScrollPane sp = new JScrollPane(); | ||
| 66 | + sp.setViewportView(tree); | ||
| 67 | + window.add(sp); | ||
| 68 | + pps.whenDone(updateListener); | ||
| 69 | + pps.registerListener(updateListener); | ||
| 70 | + | ||
| 71 | + tree.addTreeSelectionListener(e -> { | ||
| 72 | + if (tree.getLastSelectedPathComponent() != null) { | ||
| 73 | + DefaultMutableTreeNode tnode = | ||
| 74 | + (DefaultMutableTreeNode) tree.getLastSelectedPathComponent(); | ||
| 75 | + if (tnode.getUserObject() instanceof ASTNode) { | ||
| 76 | + ASTNode node = (ASTNode) tnode.getUserObject(); | ||
| 77 | + pps.whenDone(ps -> { | ||
| 78 | + SketchInterval si = ps.mapJavaToSketch(node); | ||
| 79 | + if (!ps.inRange(si)) return; | ||
| 80 | + EventQueue.invokeLater(() -> { | ||
| 81 | + editor.highlight(si.tabIndex, si.startTabOffset, si.stopTabOffset); | ||
| 82 | + }); | ||
| 83 | + }); | ||
| 84 | + } | ||
| 85 | + } | ||
| 86 | + }); | ||
| 87 | + } | ||
| 88 | + | ||
| 89 | + | ||
| 90 | + void dispose() { | ||
| 91 | + if (window != null) { | ||
| 92 | + window.dispose(); | ||
| 93 | + } | ||
| 94 | + } | ||
| 95 | + | ||
| 96 | + | ||
| 97 | + // Thread: worker | ||
| 98 | + void buildAndUpdateTree(PreprocessedSketch ps) { | ||
| 99 | + CompilationUnit cu = ps.compilationUnit; | ||
| 100 | + if (cu.types().isEmpty()){ | ||
| 101 | + Messages.loge("No Type found in CU"); | ||
| 102 | + return; | ||
| 103 | + } | ||
| 104 | + | ||
| 105 | + Deque<DefaultMutableTreeNode> treeNodeStack = new ArrayDeque<>(); | ||
| 106 | + | ||
| 107 | + ASTNode type0 = (ASTNode) cu.types().get(0); | ||
| 108 | + type0.accept(new ASTVisitor() { | ||
| 109 | + @Override | ||
| 110 | + public boolean preVisit2(ASTNode node) { | ||
| 111 | + treeNodeStack.push(new DefaultMutableTreeNode(node)); | ||
| 112 | + return super.preVisit2(node); | ||
| 113 | + } | ||
| 114 | + | ||
| 115 | + @Override | ||
| 116 | + public void postVisit(ASTNode node) { | ||
| 117 | + if (treeNodeStack.size() > 1) { | ||
| 118 | + DefaultMutableTreeNode treeNode = treeNodeStack.pop(); | ||
| 119 | + treeNodeStack.peek().add(treeNode); | ||
| 120 | + } | ||
| 121 | + } | ||
| 122 | + }); | ||
| 123 | + | ||
| 124 | + DefaultMutableTreeNode codeTree = treeNodeStack.pop(); | ||
| 125 | + | ||
| 126 | + EventQueue.invokeLater(() -> { | ||
| 127 | + if (tree.hasFocus() || window.hasFocus()) { | ||
| 128 | + return; | ||
| 129 | + } | ||
| 130 | + tree.setModel(new DefaultTreeModel(codeTree)); | ||
| 131 | + ((DefaultTreeModel) tree.getModel()).reload(); | ||
| 132 | + tree.validate(); | ||
| 133 | + if (!window.isVisible()) { | ||
| 134 | + window.setVisible(true); | ||
| 135 | + } | ||
| 136 | + }); | ||
| 137 | + } | ||
| 138 | + } | ||
| Back | FazBrowse Home | New Git URL |
0 commit comments