@Override protected Transferable createTransferable(JComponent c) { if (!(c instanceof XDebuggerTree)) { return null; } XDebuggerTree tree = (XDebuggerTree) c; //noinspection deprecation TreePath[] selectedPaths = tree.getSelectionPaths(); if (selectedPaths == null || selectedPaths.length == 0) { return null; } StringBuilder plainBuf = new StringBuilder(); StringBuilder htmlBuf = new StringBuilder(); htmlBuf.append("<html>\n<body>\n<ul>\n"); TextTransferable.ColoredStringBuilder coloredTextContainer = new TextTransferable.ColoredStringBuilder(); for (TreePath path : selectedPaths) { htmlBuf.append(" <li>"); Object node = path.getLastPathComponent(); if (node != null) { if (node instanceof XDebuggerTreeNode) { ((XDebuggerTreeNode) node).appendToComponent(coloredTextContainer); coloredTextContainer.appendTo(plainBuf, htmlBuf); } else { String text = node.toString(); plainBuf.append(text); htmlBuf.append(text); } } plainBuf.append('\n'); htmlBuf.append("</li>\n"); } // remove the last newline plainBuf.setLength(plainBuf.length() - 1); htmlBuf.append("</ul>\n</body>\n</html>"); return new TextTransferable(htmlBuf.toString(), plainBuf.toString()); }
@Override public void processSessionEvent(@NotNull final SessionEvent event) { XStackFrame stackFrame = mySession.getCurrentStackFrame(); XDebuggerTree tree = myTreePanel.getTree(); if (event == SessionEvent.BEFORE_RESUME || event == SessionEvent.SETTINGS_CHANGED) { if (myTreeRestorer != null) { myTreeRestorer.dispose(); } myTreeState = XDebuggerTreeState.saveState(tree); if (event == SessionEvent.BEFORE_RESUME) { return; } } if (stackFrame != null) { tree.setSourcePosition(stackFrame.getSourcePosition()); myRootNode.updateWatches(stackFrame.getEvaluator()); if (myTreeState != null) { myTreeRestorer = myTreeState.restoreState(tree); } } else { tree.setSourcePosition(null); myRootNode.updateWatches(null); } }
@Nullable public static XValueNodeImpl getSelectedNode(final DataContext dataContext) { XDebuggerTree tree = XDebuggerTree.getTree(dataContext); if (tree == null) return null; TreePath path = tree.getSelectionPath(); if (path == null) return null; Object node = path.getLastPathComponent(); return node instanceof XValueNodeImpl ? (XValueNodeImpl) node : null; }
private void showTree(final XValue value, final String name) { XDebuggerTree tree = new XDebuggerTree( myDebugSession, myDebugSession.getDebugProcess().getEditorsProvider(), myDebugSession.getCurrentPosition(), XDebuggerActions.VALUE_HINT_TREE_POPUP_GROUP); tree.getModel().addTreeModelListener(createTreeListener(tree)); XValueHintTreeComponent component = new XValueHintTreeComponent(this, tree, Pair.create(value, name)); showTreePopup(component, tree, name); }
public void actionPerformed(final AnActionEvent e) { XDebuggerTree tree = XDebuggerTree.getTree(e); if (tree == null) return; List<? extends WatchNode> watchNodes = getSelectedNodes(tree, WatchNode.class); if (watchNodes.size() != 1) return; WatchNode node = watchNodes.get(0); XDebuggerTreeNode root = tree.getRoot(); if (root instanceof WatchesRootNode) { ((WatchesRootNode) root).editWatch(node); } }
@Override public void update(final AnActionEvent e) { XDebuggerTree tree = XDebuggerTree.getTree(e); e.getPresentation() .setVisible(tree != null && getSelectedNodes(tree, WatchNode.class).size() == 1); super.update(e); }
private void disposeIfFinished() { if (myNode2ParentState.isEmpty() && myNode2State.isEmpty()) { if (myLastVisibleNodeRect != null) { myTree.scrollRectToVisible(myLastVisibleNodeRect); } dispose(); } }
private XDebuggerTreeState(@NotNull XDebuggerTree tree) { myRootInfo = new NodeInfo("", "", false); ApplicationManager.getApplication().assertIsDispatchThread(); final XDebuggerTreeNode root = (XDebuggerTreeNode) tree.getTreeModel().getRoot(); if (root != null) { addChildren(tree, myRootInfo, root); } }
private void addChildren( final XDebuggerTree tree, final NodeInfo nodeInfo, final XDebuggerTreeNode treeNode) { if (tree.isExpanded(treeNode.getPath())) { List<? extends XDebuggerTreeNode> children = treeNode.getLoadedChildren(); if (children != null) { nodeInfo.myExpanded = true; for (XDebuggerTreeNode child : children) { final TreePath path = child.getPath(); final Rectangle bounds = tree.getPathBounds(path); if (bounds != null && tree.getVisibleRect().contains(bounds)) { myLastVisibleNodeRect = bounds; } NodeInfo childInfo = createNode(child, tree.isPathSelected(path)); if (childInfo != null) { nodeInfo.addChild(childInfo); addChildren(tree, childInfo, child); } } } } }
private void restoreChildren( final XDebuggerTreeNode treeNode, final XDebuggerTreeState.NodeInfo nodeInfo) { if (nodeInfo.isExpanded()) { myTree.expandPath(treeNode.getPath()); List<? extends XDebuggerTreeNode> children = treeNode.getLoadedChildren(); if (children != null) { for (XDebuggerTreeNode child : children) { restoreNode(child, nodeInfo); } } myNode2State.put(treeNode, nodeInfo); } }
private void doRestoreNode( final RestorableStateNode treeNode, final XDebuggerTreeState.NodeInfo nodeInfo) { if (nodeInfo != null) { if (!checkExtendedModified(treeNode) && !(Comparing.equal(nodeInfo.getValue(), treeNode.getRawValue()))) { treeNode.markChanged(); } if (!myStopRestoringSelection && nodeInfo.isSelected()) { try { myInsideRestoring = true; myTree.addSelectionPath(treeNode.getPath()); } finally { myInsideRestoring = false; } } restoreChildren((XDebuggerTreeNode) treeNode, nodeInfo); } else if (!checkExtendedModified(treeNode)) { treeNode.markChanged(); } }
public XWatchesViewImpl( @NotNull final XDebugSession session, final @NotNull XDebugSessionData sessionData) { mySession = session; mySessionData = sessionData; myTreePanel = new XDebuggerTreePanel( session.getProject(), session.getDebugProcess().getEditorsProvider(), this, null, XDebuggerActions.WATCHES_TREE_POPUP_GROUP, ((XDebugSessionImpl) session).getValueMarkers()); ActionManager actionManager = ActionManager.getInstance(); XDebuggerTree tree = myTreePanel.getTree(); actionManager .getAction(XDebuggerActions.XNEW_WATCH) .registerCustomShortcutSet(CommonShortcuts.INSERT, tree); actionManager .getAction(XDebuggerActions.XREMOVE_WATCH) .registerCustomShortcutSet(CommonShortcuts.DELETE, tree); CustomShortcutSet f2Shortcut = new CustomShortcutSet(KeyStroke.getKeyStroke(KeyEvent.VK_F2, 0)); actionManager .getAction(XDebuggerActions.XEDIT_WATCH) .registerCustomShortcutSet(f2Shortcut, tree); DnDManager.getInstance().registerTarget(this, tree); myRootNode = new WatchesRootNode(tree, session, this, sessionData.getWatchExpressions()); tree.setRoot(myRootNode, false); final ToolbarDecorator decorator = ToolbarDecorator.createDecorator(myTreePanel.getTree()).disableUpDownActions(); decorator.setAddAction( new AnActionButtonRunnable() { @Override public void run(AnActionButton button) { executeAction(XDebuggerActions.XNEW_WATCH); } }); decorator.setRemoveAction( new AnActionButtonRunnable() { @Override public void run(AnActionButton button) { executeAction(XDebuggerActions.XREMOVE_WATCH); } }); CustomLineBorder border = new CustomLineBorder( CaptionPanel.CNT_ACTIVE_BORDER_COLOR, SystemInfo.isMac ? 1 : 0, 0, SystemInfo.isMac ? 0 : 1, 0); decorator.setToolbarBorder(border); myDecoratedPanel = decorator.createPanel(); myDecoratedPanel.setBorder(null); myTreePanel.getTree().getEmptyText().setText(XDebuggerBundle.message("debugger.no.watches")); }
public XDebuggerTreeRestorer(final XDebuggerTree tree, Rectangle lastVisibleNodeRect) { myTree = tree; myLastVisibleNodeRect = lastVisibleNodeRect; tree.addTreeListener(this); tree.addTreeSelectionListener(this); }
public void dispose() { myNode2ParentState.clear(); myNode2State.clear(); myTree.removeTreeListener(this); myTree.removeTreeSelectionListener(this); }
public XDebuggerTreeRestorer restoreState(@NotNull XDebuggerTree tree) { ApplicationManager.getApplication().assertIsDispatchThread(); XDebuggerTreeRestorer restorer = new XDebuggerTreeRestorer(tree, myLastVisibleNodeRect); restorer.restoreChildren(((XDebuggerTreeNode) tree.getTreeModel().getRoot()), myRootInfo); return restorer; }