List of usage examples for com.intellij.openapi.actionSystem DefaultActionGroup DefaultActionGroup
public DefaultActionGroup(@NotNull List<? extends AnAction> actions)
From source file:cn.fishy.plugin.idea.ponytail.Console.java
License:Apache License
private DefaultActionGroup createPopupActions(ActionManager actionManager, ClearLogAction action) { AnAction[] children = ((ActionGroup) actionManager.getAction(IdeActions.GROUP_CONSOLE_EDITOR_POPUP)) .getChildren(null);/*w w w. j av a 2 s . c om*/ DefaultActionGroup group = new DefaultActionGroup(children); group.addSeparator(); group.add(action); return group; }
From source file:com.android.tools.idea.editors.hprof.HprofView.java
License:Apache License
public HprofView(@NotNull Project project, @NotNull HprofEditor editor, @NotNull Snapshot snapshot) { JBPanel treePanel = new JBPanel(new BorderLayout()); treePanel.setBackground(JBColor.background()); mySnapshot = snapshot;/*from w w w . ja v a2s . com*/ assert (mySnapshot.getHeaps().size() > 0); Heap currentHeap = null; for (Heap heap : mySnapshot.getHeaps()) { if ("app".equals(heap.getName())) { currentHeap = heap; break; } else if (currentHeap == null) { currentHeap = heap; } } if (currentHeap == null) { editor.setInvalid(); // TODO: Add a simple panel to show that the hprof file is invalid. throw new IllegalStateException("Invalid heap given to HprofViewPanel."); } mySelectionModel = new SelectionModel(currentHeap); Disposer.register(this, mySelectionModel); DefaultActionGroup group = new DefaultActionGroup(new ComboBoxAction() { @NotNull @Override protected DefaultActionGroup createPopupActionGroup(JComponent button) { DefaultActionGroup group = new DefaultActionGroup(); assert mySnapshot != null; for (final Heap heap : mySnapshot.getHeaps()) { if ("default".equals(heap.getName()) && heap.getClasses().isEmpty() && heap.getInstancesCount() == 0) { continue; } group.add(new AnAction(StringUtil.capitalize(heap.getName() + " heap")) { @Override public void actionPerformed(AnActionEvent e) { mySelectionModel.setHeap(heap); } }); } return group; } @Override public void update(AnActionEvent e) { super.update(e); if (mySnapshot != null) { // Perform a check since the IDE sometimes updates the buttons after the view/snapshot is disposed. getTemplatePresentation() .setText(StringUtil.capitalize(mySelectionModel.getHeap().getName() + " heap")); e.getPresentation() .setText(StringUtil.capitalize(mySelectionModel.getHeap().getName() + " heap")); } } }); final InstanceReferenceTreeView referenceTree = new InstanceReferenceTreeView(project, mySelectionModel); treePanel.add(referenceTree.getComponent(), BorderLayout.CENTER); final InstancesTreeView instancesTreeView = new InstancesTreeView(project, mySelectionModel); Disposer.register(this, instancesTreeView); final ClassesTreeView classesTreeView = new ClassesTreeView(project, group, mySelectionModel); JBSplitter splitter = createNavigationSplitter(classesTreeView.getComponent(), instancesTreeView.getComponent()); Disposer.register(this, classesTreeView); GoToInstanceListener goToInstanceListener = new GoToInstanceListener() { @Override public void goToInstance(@NotNull Instance instance) { ClassObj classObj = instance instanceof ClassObj ? (ClassObj) instance : instance.getClassObj(); mySelectionModel.setHeap(instance.getHeap()); mySelectionModel.setClassObj(classObj); classesTreeView.requestFocus(); if (instance instanceof ClassInstance || instance instanceof ArrayInstance) { mySelectionModel.setInstance(instance); instancesTreeView.requestFocus(); } } }; referenceTree.addGoToInstanceListener(goToInstanceListener); instancesTreeView.addGoToInstanceListener(goToInstanceListener); JBPanel classPanel = new JBPanel(new BorderLayout()); classPanel.add(splitter, BorderLayout.CENTER); JBSplitter mainSplitter = new JBSplitter(true); mainSplitter.setFirstComponent(classPanel); mainSplitter.setSecondComponent(treePanel); mainSplitter.setDividerWidth(DIVIDER_WIDTH); myContainer = new JPanel(new LightFillLayout()); ActionToolbar toolbar = ActionManager.getInstance().createActionToolbar(ActionPlaces.UNKNOWN, group, true); toolbar.getComponent().setName(TOOLBAR_NAME); myContainer.add(toolbar.getComponent(), BorderLayout.NORTH); myContainer.add(mainSplitter); group.add(new Separator()); group.add(new BrowserHelpAction("Hprof Viewer", "http://developer.android.com/r/studio-ui/am-hprof.html")); }
From source file:com.android.tools.idea.editors.hprof.HprofViewPanel.java
License:Apache License
public HprofViewPanel(@NotNull final Project project, @NotNull HprofEditor editor, @NotNull final Snapshot snapshot) { JBPanel treePanel = new JBPanel(new BorderLayout()); treePanel.setBackground(JBColor.background()); assert (snapshot.getHeaps().size() > 0); Heap currentHeap = null;// w ww. java 2 s . c o m for (Heap heap : snapshot.getHeaps()) { if ("app".equals(heap.getName())) { currentHeap = heap; break; } else if (currentHeap == null) { currentHeap = heap; } } if (currentHeap == null) { editor.setInvalid(); return; } mySelectionModel = new SelectionModel(currentHeap); final InstanceReferenceTree referenceTree = new InstanceReferenceTree(mySelectionModel); treePanel.add(referenceTree.getComponent(), BorderLayout.CENTER); final InstancesTree instancesTree = new InstancesTree(project, mySelectionModel); final ClassesTreeView classesTreeView = new ClassesTreeView(mySelectionModel); JBSplitter splitter = createNavigationSplitter(classesTreeView.getComponent(), instancesTree.getComponent()); JBPanel classPanel = new JBPanel(new BorderLayout()); classPanel.add(splitter, BorderLayout.CENTER); DefaultActionGroup group = new DefaultActionGroup(new ComboBoxAction() { @NotNull @Override protected DefaultActionGroup createPopupActionGroup(JComponent button) { DefaultActionGroup group = new DefaultActionGroup(); for (final Heap heap : snapshot.getHeaps()) { if ("default".equals(heap.getName()) && heap.getClasses().isEmpty() && heap.getInstances().isEmpty()) { continue; } group.add(new AnAction(heap.getName() + " heap") { @Override public void actionPerformed(AnActionEvent e) { mySelectionModel.setHeap(heap); } }); } return group; } @Override public void update(AnActionEvent e) { super.update(e); getTemplatePresentation().setText(mySelectionModel.getHeap().getName() + " heap"); e.getPresentation().setText(mySelectionModel.getHeap().getName() + " heap"); } }); ActionToolbar toolbar = ActionManager.getInstance().createActionToolbar(ActionPlaces.UNKNOWN, group, true); classPanel.add(toolbar.getComponent(), BorderLayout.NORTH); JBSplitter mainSplitter = new JBSplitter(true); mainSplitter.setFirstComponent(classPanel); mainSplitter.setSecondComponent(treePanel); mainSplitter.setDividerWidth(DIVIDER_WIDTH); myContainer = new JPanel(new BorderLayout()); myContainer.add(mainSplitter); }
From source file:com.android.tools.idea.editors.hprof.views.ClassesTreeView.java
License:Apache License
public ClassesTreeView(@NotNull Project project, @NotNull DefaultActionGroup editorActionGroup, @NotNull final SelectionModel selectionModel) { myProject = project;/*from w w w . j ava 2s . c om*/ myRoot = new HeapPackageNode(null, ""); myTreeModel = new DefaultTreeModel(myRoot); myTree = new Tree(myTreeModel); myTree.setName(TREE_NAME); myDisplayMode = DisplayMode.LIST; myTree.setRootVisible(false); myTree.setShowsRootHandles(false); myTree.setLargeModel(true); myTree.putClientProperty(DataManager.CLIENT_PROPERTY_DATA_PROVIDER, this); JBList contextActionList = new JBList(new EditMultipleSourcesAction()); JBPopupFactory.getInstance().createListPopupBuilder(contextActionList); final DefaultActionGroup popupGroup = new DefaultActionGroup(new EditMultipleSourcesAction()); myTree.addMouseListener(new PopupHandler() { @Override public void invokePopup(Component comp, int x, int y) { ActionManager.getInstance().createActionPopupMenu(ActionPlaces.UNKNOWN, popupGroup).getComponent() .show(comp, x, y); } }); editorActionGroup.addAction(new ComboBoxAction() { @NotNull @Override protected DefaultActionGroup createPopupActionGroup(JComponent button) { DefaultActionGroup group = new DefaultActionGroup(); for (final DisplayMode mode : DisplayMode.values()) { group.add(new AnAction(mode.toString()) { @Override public void actionPerformed(AnActionEvent e) { myDisplayMode = mode; boolean isTreeMode = myDisplayMode == DisplayMode.TREE; myTree.setShowsRootHandles(isTreeMode); if (isTreeMode) { myTreeIndex.buildTree(mySelectedHeapId); } else { myListIndex.buildList(myRoot); } restoreViewState(selectionModel); } }); } return group; } @Override public void update(AnActionEvent e) { super.update(e); getTemplatePresentation().setText(myDisplayMode.toString()); e.getPresentation().setText(myDisplayMode.toString()); } }); myListIndex = new ListIndex(); myTreeIndex = new TreeIndex(); selectionModel.addListener(myListIndex); // Add list index first, since that always updates; and tree index depends on it. selectionModel.addListener(myTreeIndex); selectionModel.addListener(new SelectionModel.SelectionListener() { @Override public void onHeapChanged(@NotNull Heap heap) { mySelectedHeapId = heap.getId(); assert myListIndex.myHeapId == mySelectedHeapId; if (myDisplayMode == DisplayMode.LIST) { myListIndex.buildList(myRoot); } else if (myDisplayMode == DisplayMode.TREE) { myTreeIndex.buildTree(mySelectedHeapId); } restoreViewState(selectionModel); } @Override public void onClassObjChanged(@Nullable ClassObj classObj) { TreeNode nodeToSelect = null; if (classObj != null) { nodeToSelect = findClassObjNode(classObj); } if (nodeToSelect != null) { TreePath pathToSelect = new TreePath(myTreeModel.getPathToRoot(nodeToSelect)); myTree.setSelectionPath(pathToSelect); myTree.scrollPathToVisible(pathToSelect); } } @Override public void onInstanceChanged(@Nullable Instance instance) { } }); myTree.addTreeSelectionListener(e -> { TreePath path = e.getPath(); if (!e.isAddedPath()) { return; } if (path == null || path.getPathCount() < 2) { selectionModel.setClassObj(null); return; } assert path.getLastPathComponent() instanceof HeapNode; HeapNode heapNode = (HeapNode) path.getLastPathComponent(); if (heapNode instanceof HeapClassObjNode) { selectionModel.setClassObj(((HeapClassObjNode) heapNode).getClassObj()); } }); ColumnTreeBuilder builder = new ColumnTreeBuilder(myTree) .addColumn(new ColumnTreeBuilder.ColumnBuilder().setName("Class Name").setPreferredWidth(800) .setHeaderAlignment(SwingConstants.LEFT).setComparator((HeapNode a, HeapNode b) -> { int valueA = a instanceof HeapPackageNode ? 0 : 1; int valueB = b instanceof HeapPackageNode ? 0 : 1; if (valueA != valueB) { return valueA - valueB; } return compareNames(a, b); }).setRenderer(new ColoredTreeCellRenderer() { @Override public void customizeCellRenderer(@NotNull JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { if (value instanceof HeapClassObjNode) { ClassObj clazz = ((HeapClassObjNode) value).getClassObj(); String name = clazz.getClassName(); String pkg = null; int i = name.lastIndexOf("."); if (i != -1) { pkg = name.substring(0, i); name = name.substring(i + 1); } append(name, SimpleTextAttributes.REGULAR_ATTRIBUTES); if (pkg != null) { append(" (" + pkg + ")", new SimpleTextAttributes(Font.PLAIN, JBColor.GRAY)); } setTransparentIconBackground(true); setIcon(PlatformIcons.CLASS_ICON); // TODO reformat anonymous classes (ANONYMOUS_CLASS_ICON) to match IJ. } else if (value instanceof HeapNode) { append(((HeapNode) value).getSimpleName(), SimpleTextAttributes.REGULAR_ATTRIBUTES); setTransparentIconBackground(true); setIcon(PlatformIcons.PACKAGE_ICON); } else { append("This should not be rendered"); } } })) .addColumn(new ColumnTreeBuilder.ColumnBuilder().setName("Total Count").setPreferredWidth(100) .setHeaderAlignment(SwingConstants.RIGHT).setComparator((HeapNode a, HeapNode b) -> { int result = a.getTotalCount() - b.getTotalCount(); return result == 0 ? compareNames(a, b) : result; }).setRenderer(new ColoredTreeCellRenderer() { @Override public void customizeCellRenderer(@NotNull JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { if (value instanceof HeapNode) { append(Integer.toString(((HeapNode) value).getTotalCount())); } setTextAlign(SwingConstants.RIGHT); } })) .addColumn(new ColumnTreeBuilder.ColumnBuilder().setName("Heap Count").setPreferredWidth(100) .setHeaderAlignment(SwingConstants.RIGHT).setComparator((HeapNode a, HeapNode b) -> { int result = a.getHeapInstancesCount(mySelectedHeapId) - b.getHeapInstancesCount(mySelectedHeapId); return result == 0 ? compareNames(a, b) : result; }).setRenderer(new ColoredTreeCellRenderer() { @Override public void customizeCellRenderer(@NotNull JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { if (value instanceof HeapNode) { append(Integer .toString(((HeapNode) value).getHeapInstancesCount(mySelectedHeapId))); } setTextAlign(SwingConstants.RIGHT); } })) .addColumn(new ColumnTreeBuilder.ColumnBuilder().setName("Sizeof").setPreferredWidth(80) .setHeaderAlignment(SwingConstants.RIGHT).setComparator((HeapNode a, HeapNode b) -> { int sizeA = a.getInstanceSize(); int sizeB = b.getInstanceSize(); if (sizeA < 0 && sizeB < 0) { return compareNames(a, b); } int result = sizeA - sizeB; return result == 0 ? compareNames(a, b) : result; }).setRenderer(new ColoredTreeCellRenderer() { @Override public void customizeCellRenderer(@NotNull JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { if (value instanceof HeapClassObjNode) { append(Integer.toString(((HeapClassObjNode) value).getInstanceSize())); } setTextAlign(SwingConstants.RIGHT); } })) .addColumn(new ColumnTreeBuilder.ColumnBuilder().setName("Shallow Size").setPreferredWidth(100) .setHeaderAlignment(SwingConstants.RIGHT).setComparator((HeapNode a, HeapNode b) -> { int result = a.getShallowSize(mySelectedHeapId) - b.getShallowSize(mySelectedHeapId); return result == 0 ? compareNames(a, b) : result; }).setRenderer(new ColoredTreeCellRenderer() { @Override public void customizeCellRenderer(@NotNull JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { if (value instanceof HeapNode) { append(Integer.toString(((HeapNode) value).getShallowSize(mySelectedHeapId))); } setTextAlign(SwingConstants.RIGHT); } })) .addColumn(new ColumnTreeBuilder.ColumnBuilder().setName("Retained Size").setPreferredWidth(120) .setHeaderAlignment(SwingConstants.RIGHT).setInitialOrder(SortOrder.DESCENDING) .setComparator((HeapNode a, HeapNode b) -> { long result = a.getRetainedSize() - b.getRetainedSize(); return result == 0 ? compareNames(a, b) : (result > 0 ? 1 : -1); }).setRenderer(new ColoredTreeCellRenderer() { @Override public void customizeCellRenderer(@NotNull JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { if (value instanceof HeapNode) { append(Long.toString(((HeapNode) value).getRetainedSize())); } setTextAlign(SwingConstants.RIGHT); } })); //noinspection NullableProblems builder.setTreeSorter(new ColumnTreeBuilder.TreeSorter<HeapNode>() { @Override public void sort(@NotNull Comparator<HeapNode> comparator, @NotNull SortOrder sortOrder) { if (myComparator != comparator) { myComparator = comparator; selectionModel.setSelectionLocked(true); TreePath selectionPath = myTree.getSelectionPath(); sortTree(myRoot); myTreeModel.nodeStructureChanged(myRoot); myTree.setSelectionPath(selectionPath); myTree.scrollPathToVisible(selectionPath); selectionModel.setSelectionLocked(false); } } }); myColumnTree = builder.build(); installTreeSpeedSearch(); }
From source file:com.android.tools.idea.editors.hprof.views.InstanceReferenceTreeView.java
License:Apache License
public InstanceReferenceTreeView(@NotNull Project project, @NotNull SelectionModel selectionModel) { myProject = project;//from w w w . j a v a2 s . c om final TreeBuilder model = new TreeBuilder(null) { @Override public void buildChildren(TreeBuilderNode node) { if (node == getRoot()) { node.add(new InstanceNode(this, myInstance)); } else { addReferences((InstanceNode) node); } nodeChanged(node); } @Override public boolean isExpandable(TreeBuilderNode node) { if (node == getRoot()) { return node.getChildCount() > 0; } else { Instance instance = (Instance) node.getUserObject(); return instance.getHardReverseReferences().size() > 0 || instance.getSoftReverseReferences() != null; } } }; // Set the root to a dummy object since the TreeBuilder implementation is very buggy. model.setRoot(new TreeBuilderNode(null) { @Override protected TreeBuilder getTreeBuilder() { return model; } }); myTree = new Tree(model); myTree.setName(TREE_NAME); myTree.setRootVisible(false); myTree.setShowsRootHandles(true); myTree.setLargeModel(true); myTree.addTreeExpansionListener(new TreeExpansionListener() { private boolean myIsCurrentlyExpanding = false; @Override public void treeExpanded(TreeExpansionEvent event) { if (myIsCurrentlyExpanding) { return; } myIsCurrentlyExpanding = true; InstanceNode node = (InstanceNode) event.getPath().getLastPathComponent(); InstanceNode currentNode = node; int recursiveDepth = MAX_AUTO_EXPANSION_DEPTH; while (currentNode.getChildCount() == 1 && recursiveDepth > 0) { InstanceNode childNode = (InstanceNode) currentNode.getChildAt(0); if (childNode.isLeaf() || childNode.getInstance().getDistanceToGcRoot() == 0) { break; } currentNode = childNode; Instance currentInstance = currentNode.getInstance(); --recursiveDepth; if (currentInstance.getDistanceToGcRoot() == 0) { break; } } if (node != currentNode) { myTree.expandPath(new TreePath(currentNode.getPath())); } myIsCurrentlyExpanding = false; } @Override public void treeCollapsed(TreeExpansionEvent event) { } }); myTree.putClientProperty(DataManager.CLIENT_PROPERTY_DATA_PROVIDER, this); JBList contextActionList = new JBList(new EditMultipleSourcesAction()); JBPopupFactory.getInstance().createListPopupBuilder(contextActionList); final DefaultActionGroup popupGroup = new DefaultActionGroup(new EditMultipleSourcesAction()); myGoToInstanceAction = new GoToInstanceAction(myTree); popupGroup.add(myGoToInstanceAction); myTree.addMouseListener(new PopupHandler() { @Override public void invokePopup(Component comp, int x, int y) { ActionManager.getInstance().createActionPopupMenu(ActionPlaces.UNKNOWN, popupGroup).getComponent() .show(comp, x, y); } }); ColumnTreeBuilder builder = new ColumnTreeBuilder(myTree) .addColumn(new ColumnTreeBuilder.ColumnBuilder().setName("Reference Tree").setPreferredWidth(1200) .setHeaderAlignment(SwingConstants.LEFT).setRenderer(new ColoredTreeCellRenderer() { @Override public void customizeCellRenderer(@NotNull JTree tree, @Nullable Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { if (value instanceof InstanceNode) { InstanceNode node = (InstanceNode) value; Instance instance = node.getInstance(); String[] referenceVarNames = node.getVarNames(); if (referenceVarNames.length > 0) { if (instance instanceof ArrayInstance) { append(StringUtil.pluralize("Index", referenceVarNames.length), SimpleTextAttributes.GRAYED_ITALIC_ATTRIBUTES); append(" ", SimpleTextAttributes.REGULAR_ATTRIBUTES); } StringBuilder builder = new StringBuilder(); builder.append(referenceVarNames[0]); for (int i = 1; i < referenceVarNames.length; ++i) { builder.append(", "); builder.append(referenceVarNames[i]); } append(builder.toString(), instance.getIsSoftReference() ? SOFT_REFERENCE_TEXT_ATTRIBUTE : XDebuggerUIConstants.VALUE_NAME_ATTRIBUTES); append(" in ", SimpleTextAttributes.GRAYED_ITALIC_ATTRIBUTES); } SimpleTextAttributes classTextAttributes; if (myInstance.getImmediateDominator() == instance) { classTextAttributes = SimpleTextAttributes.SYNTHETIC_ATTRIBUTES; } else if (instance.getIsSoftReference()) { classTextAttributes = SimpleTextAttributes.REGULAR_ITALIC_ATTRIBUTES; } else if (instance.getDistanceToGcRoot() == 0) { classTextAttributes = SimpleTextAttributes.REGULAR_BOLD_ATTRIBUTES; } else if (instance.getImmediateDominator() == null) { classTextAttributes = SimpleTextAttributes.ERROR_ATTRIBUTES; } else { classTextAttributes = SimpleTextAttributes.REGULAR_ATTRIBUTES; } if (instance instanceof ArrayInstance) { setIcon(AllIcons.Debugger.Db_array); } else if (instance instanceof ClassObj) { setIcon(PlatformIcons.FIELD_ICON); } else { setIcon(AllIcons.Debugger.Value); } if (myInstance.getImmediateDominator() == instance || instance.getDistanceToGcRoot() == 0) { int totalIcons = 1 + (myInstance.getImmediateDominator() == instance ? 1 : 0) + (instance.getDistanceToGcRoot() == 0 ? 1 : 0); RowIcon icons = new RowIcon(totalIcons); icons.setIcon(getIcon(), 0); int currentIcon = 1; if (myInstance.getImmediateDominator() == instance) { icons.setIcon(AllIcons.Hierarchy.Class, currentIcon++); } if (instance.getDistanceToGcRoot() == 0) { icons.setIcon(AllIcons.Hierarchy.Subtypes, currentIcon); } setIcon(icons); } append(instance.toString(), classTextAttributes); } else if (value != null) { append(StringUtil.notNullize(value.toString()), SimpleTextAttributes.ERROR_ATTRIBUTES); } } })) .addColumn(new ColumnTreeBuilder.ColumnBuilder().setName("Depth").setPreferredWidth(40) .setHeaderAlignment(SwingConstants.RIGHT).setRenderer(new ColoredTreeCellRenderer() { @Override public void customizeCellRenderer(@NotNull JTree tree, @Nullable Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { if (value instanceof InstanceNode) { Instance instance = ((InstanceNode) value).getInstance(); if (instance != null && instance.getDistanceToGcRoot() != Integer.MAX_VALUE) { append(String.valueOf(instance.getDistanceToGcRoot()), SimpleTextAttributes.REGULAR_ATTRIBUTES); } setTextAlign(SwingConstants.RIGHT); } } })) .addColumn(new ColumnTreeBuilder.ColumnBuilder().setName("Shallow Size").setPreferredWidth(80) .setHeaderAlignment(SwingConstants.RIGHT).setRenderer(new ColoredTreeCellRenderer() { @Override public void customizeCellRenderer(@NotNull JTree tree, @Nullable Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { if (value instanceof InstanceNode) { Instance instance = ((InstanceNode) value).getInstance(); if (instance != null) { append(String.valueOf(instance.getSize()), SimpleTextAttributes.REGULAR_ATTRIBUTES); } setTextAlign(SwingConstants.RIGHT); } } })) .addColumn(new ColumnTreeBuilder.ColumnBuilder().setName("Dominating Size").setPreferredWidth(80) .setHeaderAlignment(SwingConstants.RIGHT).setRenderer(new ColoredTreeCellRenderer() { @Override public void customizeCellRenderer(@NotNull JTree tree, @Nullable Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { if (value instanceof InstanceNode) { Instance instance = ((InstanceNode) value).getInstance(); if (instance != null && instance.getDistanceToGcRoot() != Integer.MAX_VALUE) { append(String.valueOf(instance.getTotalRetainedSize()), SimpleTextAttributes.REGULAR_ATTRIBUTES); } setTextAlign(SwingConstants.RIGHT); } } })); myColumnTree = builder.build(); selectionModel.addListener(new SelectionModel.SelectionListener() { @Override public void onHeapChanged(@NotNull Heap heap) { clearInstance(); } @Override public void onClassObjChanged(@Nullable ClassObj classObj) { clearInstance(); } @Override public void onInstanceChanged(@Nullable Instance instance) { if (instance == null) { clearInstance(); } else { myInstance = instance; TreeBuilder model = getMutableModel(); TreeBuilderNode root = (TreeBuilderNode) model.getRoot(); root.removeAllChildren(); root.add(new InstanceNode(getMutableModel(), instance)); model.nodeStructureChanged((TreeBuilderNode) model.getRoot()); myTree.expandRow(0); } } }); }
From source file:com.android.tools.idea.editors.hprof.views.InstancesTreeView.java
License:Apache License
public InstancesTreeView(@NotNull Project project, @NotNull SelectionModel selectionModel) { myProject = project;/*from w w w. j av a 2 s . c o m*/ mySelectionModel = selectionModel; myDebuggerTree = new DebuggerTree(project) { @Override protected void build(DebuggerContextImpl context) { DebuggerTreeNodeImpl root = (DebuggerTreeNodeImpl) getModel().getRoot(); Instance instance = ((InstanceFieldDescriptorImpl) root.getDescriptor()).getInstance(); addChildren(root, null, instance); } @Override public Object getData(@NonNls String dataId) { return InstancesTreeView.this.getData(dataId); } }; myDebuggerTree.getComponent().setName(TREE_NAME); Disposer.register(myProject, this); Disposer.register(this, myDebuggerTree); myHeap = mySelectionModel.getHeap(); myDebugProcess = new DebugProcessEvents(project); final SuspendManagerImpl suspendManager = new SuspendManagerImpl(myDebugProcess); myDebugProcess.getManagerThread().invokeAndWait(new DebuggerCommandImpl() { @Override protected void action() throws Exception { myDummySuspendContext = suspendManager.pushSuspendContext(EventRequest.SUSPEND_NONE, 1); } }); final TreeBuilder model = new TreeBuilder(myDebuggerTree) { @Override public void buildChildren(TreeBuilderNode node) { final DebuggerTreeNodeImpl debuggerTreeNode = (DebuggerTreeNodeImpl) node; NodeDescriptor descriptor = debuggerTreeNode.getDescriptor(); if (descriptor instanceof DefaultNodeDescriptor) { return; } else if (descriptor instanceof ContainerDescriptorImpl) { addContainerChildren(debuggerTreeNode, 0, true); } else { InstanceFieldDescriptorImpl instanceDescriptor = (InstanceFieldDescriptorImpl) descriptor; addChildren(debuggerTreeNode, instanceDescriptor.getHprofField(), instanceDescriptor.getInstance()); } sortTree(debuggerTreeNode); myDebuggerTree.treeDidChange(); } @Override public boolean isExpandable(TreeBuilderNode builderNode) { return ((DebuggerTreeNodeImpl) builderNode).getDescriptor().isExpandable(); } }; model.setRoot(myDebuggerTree.getNodeFactory().getDefaultNode()); model.addTreeModelListener(new TreeModelListener() { @Override public void treeNodesChanged(TreeModelEvent event) { myDebuggerTree.hideTooltip(); } @Override public void treeNodesInserted(TreeModelEvent event) { myDebuggerTree.hideTooltip(); } @Override public void treeNodesRemoved(TreeModelEvent event) { myDebuggerTree.hideTooltip(); } @Override public void treeStructureChanged(TreeModelEvent event) { myDebuggerTree.hideTooltip(); } }); myDebuggerTree.setModel(model); myDebuggerTree.setRootVisible(false); myDebuggerTree.putClientProperty(DataManager.CLIENT_PROPERTY_DATA_PROVIDER, this); JBList contextActionList = new JBList(new EditMultipleSourcesAction()); JBPopupFactory.getInstance().createListPopupBuilder(contextActionList); myGoToInstanceAction = new GoToInstanceAction(myDebuggerTree); myDebuggerTree.addMouseListener(new PopupHandler() { @Override public void invokePopup(Component comp, int x, int y) { DefaultActionGroup popupGroup = new DefaultActionGroup(new EditMultipleSourcesAction()); Instance selectedInstance = mySelectionModel.getInstance(); if (selectedInstance instanceof ClassInstance && HprofBitmapProvider.canGetBitmapFromInstance(selectedInstance)) { popupGroup.add(new ViewBitmapAction()); } popupGroup.add(myGoToInstanceAction); ActionManager.getInstance().createActionPopupMenu(ActionPlaces.UNKNOWN, popupGroup).getComponent() .show(comp, x, y); } }); mySelectionModel.addListener(new SelectionModel.SelectionListener() { @Override public void onHeapChanged(@NotNull Heap heap) { if (heap != myHeap) { myHeap = heap; if (myDebuggerTree.getMutableModel().getRoot() != null) { onSelectionChanged(); } } } @Override public void onClassObjChanged(@Nullable ClassObj classObj) { if (classObj != myClassObj) { myClassObj = classObj; onSelectionChanged(); } } @Override public void onInstanceChanged(@Nullable Instance instance) { if (instance == null) { return; } TreePath path = myDebuggerTree.getSelectionPath(); if (path != null) { DebuggerTreeNodeImpl treeNode = (DebuggerTreeNodeImpl) path.getPathComponent(1); if (treeNode.getDescriptor() instanceof InstanceFieldDescriptorImpl && ((InstanceFieldDescriptorImpl) treeNode.getDescriptor()).getInstance() == instance) { return; } } DebuggerTreeNodeImpl root = (DebuggerTreeNodeImpl) myDebuggerTree.getMutableModel().getRoot(); DebuggerTreeNodeImpl targetNode = expandMoreNodesUntilFound(root, instance); if (targetNode != null) { final TreePath targetPath = new TreePath(targetNode.getPath()); myDebuggerTree.treeChanged(); myDebuggerTree.setSelectionPath(targetPath); ApplicationManager.getApplication() .invokeLater(() -> myDebuggerTree.scrollPathToVisible(targetPath)); } } private void onSelectionChanged() { DebuggerTreeNodeImpl newRoot; Instance singleChild = null; if (myClassObj != null) { ContainerDescriptorImpl containerDescriptor = new ContainerDescriptorImpl(myClassObj, myHeap.getId()); newRoot = DebuggerTreeNodeImpl.createNodeNoUpdate(myDebuggerTree, containerDescriptor); if (containerDescriptor.getInstances().size() == 1) { singleChild = containerDescriptor.getInstances().get(0); } } else { newRoot = myDebuggerTree.getNodeFactory().getDefaultNode(); } myDebuggerTree.getMutableModel().setRoot(newRoot); myDebuggerTree.treeChanged(); if (myDebuggerTree.getRowCount() > 0) { myDebuggerTree.scrollRowToVisible(0); } if (singleChild != null) { myDebuggerTree.setSelectionInterval(0, 0); mySelectionModel.setInstance(singleChild); } } }); myDebuggerTree.addTreeSelectionListener(e -> { TreePath path = e.getPath(); if (path == null || path.getPathCount() < 2 || !e.isAddedPath()) { mySelectionModel.setInstance(null); return; } DebuggerTreeNodeImpl instanceNode = (DebuggerTreeNodeImpl) path.getPathComponent(1); if (instanceNode.getDescriptor() instanceof InstanceFieldDescriptorImpl) { InstanceFieldDescriptorImpl descriptor = (InstanceFieldDescriptorImpl) instanceNode.getDescriptor(); if (descriptor.getInstance() != mySelectionModel.getInstance()) { mySelectionModel.setInstance(descriptor.getInstance()); } } // Handle node expansions (this is present when the list is large). DebuggerTreeNodeImpl lastPathNode = (DebuggerTreeNodeImpl) path.getLastPathComponent(); if (lastPathNode.getDescriptor() instanceof ExpansionDescriptorImpl) { ExpansionDescriptorImpl expansionDescriptor = (ExpansionDescriptorImpl) lastPathNode .getDescriptor(); DebuggerTreeNodeImpl parentNode = lastPathNode.getParent(); myDebuggerTree.getMutableModel().removeNodeFromParent(lastPathNode); if (parentNode.getDescriptor() instanceof ContainerDescriptorImpl) { addContainerChildren(parentNode, expansionDescriptor.getStartIndex(), true); } else if (parentNode.getDescriptor() instanceof InstanceFieldDescriptorImpl) { InstanceFieldDescriptorImpl instanceFieldDescriptor = (InstanceFieldDescriptorImpl) parentNode .getDescriptor(); addChildren(parentNode, instanceFieldDescriptor.getHprofField(), instanceFieldDescriptor.getInstance(), expansionDescriptor.getStartIndex()); } sortTree(parentNode); myDebuggerTree.getMutableModel().nodeStructureChanged(parentNode); if (myComparator != null) { myDebuggerTree.scrollPathToVisible( new TreePath(((DebuggerTreeNodeImpl) parentNode.getLastChild()).getPath())); } } }); ColumnTreeBuilder builder = new ColumnTreeBuilder(myDebuggerTree) .addColumn(new ColumnTreeBuilder.ColumnBuilder().setName("Instance").setPreferredWidth(600) .setHeaderAlignment(SwingConstants.LEFT) .setComparator(new Comparator<DebuggerTreeNodeImpl>() { @Override public int compare(@NotNull DebuggerTreeNodeImpl a, @NotNull DebuggerTreeNodeImpl b) { return getDefaultOrdering(a, b); } }).setRenderer((DebuggerTreeRenderer) myDebuggerTree.getCellRenderer())) .addColumn(new ColumnTreeBuilder.ColumnBuilder().setName("Depth").setPreferredWidth(60) .setHeaderAlignment(SwingConstants.RIGHT) .setComparator(new Comparator<DebuggerTreeNodeImpl>() { @Override public int compare(DebuggerTreeNodeImpl a, DebuggerTreeNodeImpl b) { int depthA = 0; int depthB = 0; if (a.getDescriptor() instanceof InstanceFieldDescriptorImpl) { Instance instanceA = (Instance) ((InstanceFieldDescriptorImpl) a .getDescriptor()).getValueData(); if (instanceA != null) { depthA = instanceA.getDistanceToGcRoot(); } } if (b.getDescriptor() instanceof InstanceFieldDescriptorImpl) { Instance instanceB = (Instance) ((InstanceFieldDescriptorImpl) b .getDescriptor()).getValueData(); if (instanceB != null) { depthB = instanceB.getDistanceToGcRoot(); } } if (depthA != depthB) { return depthA - depthB; } else { return getDefaultOrdering(a, b); } } }).setRenderer(new ColoredTreeCellRenderer() { @Override public void customizeCellRenderer(@NotNull JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { NodeDescriptorImpl nodeDescriptor = (NodeDescriptorImpl) ((TreeBuilderNode) value) .getUserObject(); if (nodeDescriptor instanceof InstanceFieldDescriptorImpl) { InstanceFieldDescriptorImpl descriptor = (InstanceFieldDescriptorImpl) nodeDescriptor; assert !descriptor.isPrimitive(); Instance instance = (Instance) descriptor.getValueData(); if (instance != null && instance.getDistanceToGcRoot() != Integer.MAX_VALUE) { append(String.valueOf(instance.getDistanceToGcRoot()), SimpleTextAttributes.REGULAR_ATTRIBUTES); } } setTextAlign(SwingConstants.RIGHT); } })) .addColumn(new ColumnTreeBuilder.ColumnBuilder().setName("Shallow Size").setPreferredWidth(80) .setHeaderAlignment(SwingConstants.RIGHT) .setComparator(new Comparator<DebuggerTreeNodeImpl>() { @Override public int compare(@NotNull DebuggerTreeNodeImpl a, @NotNull DebuggerTreeNodeImpl b) { int sizeA = 0; int sizeB = 0; if (a.getDescriptor() instanceof InstanceFieldDescriptorImpl) { Instance instanceA = (Instance) ((InstanceFieldDescriptorImpl) a .getDescriptor()).getValueData(); if (instanceA != null) { sizeA = instanceA.getSize(); } } if (b.getDescriptor() instanceof InstanceFieldDescriptorImpl) { Instance instanceB = (Instance) ((InstanceFieldDescriptorImpl) b .getDescriptor()).getValueData(); if (instanceB != null) { sizeB = instanceB.getSize(); } } if (sizeA != sizeB) { return sizeA - sizeB; } else { return getDefaultOrdering(a, b); } } }).setRenderer(new ColoredTreeCellRenderer() { @Override public void customizeCellRenderer(@NotNull JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { NodeDescriptorImpl nodeDescriptor = (NodeDescriptorImpl) ((TreeBuilderNode) value) .getUserObject(); if (nodeDescriptor instanceof InstanceFieldDescriptorImpl) { InstanceFieldDescriptorImpl descriptor = (InstanceFieldDescriptorImpl) nodeDescriptor; assert !descriptor.isPrimitive(); Instance instance = (Instance) descriptor.getValueData(); if (instance != null) { append(String.valueOf(instance.getSize()), SimpleTextAttributes.REGULAR_ATTRIBUTES); } } setTextAlign(SwingConstants.RIGHT); } })) .addColumn(new ColumnTreeBuilder.ColumnBuilder().setName("Dominating Size").setPreferredWidth(80) .setHeaderAlignment(SwingConstants.RIGHT) .setComparator(new Comparator<DebuggerTreeNodeImpl>() { @Override public int compare(@NotNull DebuggerTreeNodeImpl a, @NotNull DebuggerTreeNodeImpl b) { long sizeA = 0; long sizeB = 0; if (a.getDescriptor() instanceof InstanceFieldDescriptorImpl) { Instance instanceA = (Instance) ((InstanceFieldDescriptorImpl) a .getDescriptor()).getValueData(); if (instanceA != null && instanceA.getDistanceToGcRoot() != Integer.MAX_VALUE) { sizeA = instanceA.getTotalRetainedSize(); } } if (b.getDescriptor() instanceof InstanceFieldDescriptorImpl) { Instance instanceB = (Instance) ((InstanceFieldDescriptorImpl) b .getDescriptor()).getValueData(); if (instanceB != null && instanceB.getDistanceToGcRoot() != Integer.MAX_VALUE) { sizeB = instanceB.getTotalRetainedSize(); } } if (sizeA != sizeB) { return (int) (sizeA - sizeB); } else { return getDefaultOrdering(a, b); } } }).setRenderer(new ColoredTreeCellRenderer() { @Override public void customizeCellRenderer(@NotNull JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { NodeDescriptorImpl nodeDescriptor = (NodeDescriptorImpl) ((TreeBuilderNode) value) .getUserObject(); if (nodeDescriptor instanceof InstanceFieldDescriptorImpl) { InstanceFieldDescriptorImpl descriptor = (InstanceFieldDescriptorImpl) nodeDescriptor; assert !descriptor.isPrimitive(); Instance instance = (Instance) descriptor.getValueData(); if (instance != null && instance.getDistanceToGcRoot() != Integer.MAX_VALUE) { append(String.valueOf(instance.getTotalRetainedSize()), SimpleTextAttributes.REGULAR_ATTRIBUTES); } } setTextAlign(SwingConstants.RIGHT); } })); //noinspection NullableProblems builder.setTreeSorter(new ColumnTreeBuilder.TreeSorter<DebuggerTreeNodeImpl>() { @Override public void sort(@NotNull Comparator<DebuggerTreeNodeImpl> comparator, @NotNull SortOrder sortOrder) { if (myComparator != comparator && mySortOrder != sortOrder) { myComparator = comparator; mySortOrder = sortOrder; TreeBuilder mutableModel = myDebuggerTree.getMutableModel(); DebuggerTreeNodeImpl root = (DebuggerTreeNodeImpl) mutableModel.getRoot(); sortTree(root); mySelectionModel.setSelectionLocked(true); TreePath selectionPath = myDebuggerTree.getSelectionPath(); mutableModel.nodeStructureChanged(root); myDebuggerTree.setSelectionPath(selectionPath); myDebuggerTree.scrollPathToVisible(selectionPath); mySelectionModel.setSelectionLocked(false); } } }); myColumnTree = builder.build(); }
From source file:com.android.tools.idea.uibuilder.mockup.editor.tools.ExtractWidgetTool.java
License:Apache License
/** * Create the Action toolbar containing the buttons created using ourWidgetCreationActions list * * @return The toolbar JComponent to add to the layout *///from w w w. j av a2 s. c o m private JComponent createActionToolbar() { DefaultActionGroup group = new DefaultActionGroup(createActionsButtons()); if (!ourOtherCreationActions.isEmpty()) { group.addSeparator(); for (CreatorAction otherCreationAction : ourOtherCreationActions) { group.add(createAnActionButton(otherCreationAction, false)); } } ActionToolbar actionToolbar = ActionManager.getInstance().createActionToolbar(ActionPlaces.UNKNOWN, group, false); actionToolbar.setLayoutPolicy(ActionToolbar.WRAP_LAYOUT_POLICY); actionToolbar.setTargetComponent(this); actionToolbar.getComponent().setBackground(JBColor.WHITE); return actionToolbar.getComponent(); }
From source file:com.google.cloud.tools.intellij.debugger.CloudDebugProcessTest.java
License:Apache License
@Test public void testRegisterAdditionalActions_close() { ActionManager manager = ActionManager.getInstance(); AnAction action0 = manager.getAction(IdeActions.ACTION_PIN_ACTIVE_TAB); AnAction action1 = manager.getAction(IdeActions.ACTION_CLOSE); action1.getTemplatePresentation().setText("Close"); AnAction action2 = manager.getAction(IdeActions.ACTION_CONTEXT_HELP); AnAction action3 = manager.getAction(IdeActions.ACTION_CALL_HIERARCHY); List<AnAction> leftToolbarActions = Lists.newArrayList(); leftToolbarActions.add(action0);/* w w w .ja v a 2 s . c om*/ leftToolbarActions.add(action1); leftToolbarActions.add(action2); leftToolbarActions.add(action3); DefaultActionGroup leftToolbar = new DefaultActionGroup(leftToolbarActions); List<AnAction> actions = Lists.newArrayList(); DefaultActionGroup topToolbar = new DefaultActionGroup(actions); DefaultActionGroup settings = new DefaultActionGroup(actions); process.registerAdditionalActions(leftToolbar, topToolbar, settings); assertEquals(4, leftToolbar.getChildrenCount()); assertEquals(action0, leftToolbar.getChildActionsOrStubs()[0]); assertEquals(action3, leftToolbar.getChildActionsOrStubs()[1]); }
From source file:com.google.cloud.tools.intellij.debugger.CloudDebugProcessTest.java
License:Apache License
private void assertRemoveFromLeftToolbar(String actionId) { ActionManager manager = ActionManager.getInstance(); AnAction action = manager.getAction(actionId); List<AnAction> leftToolbarActions = Lists.newArrayList(); leftToolbarActions.add(action);/*from w ww.j av a2 s.c o m*/ DefaultActionGroup leftToolbar = new DefaultActionGroup(leftToolbarActions); List<AnAction> actions = Lists.newArrayList(); DefaultActionGroup topToolbar = new DefaultActionGroup(actions); DefaultActionGroup settings = new DefaultActionGroup(actions); process.registerAdditionalActions(leftToolbar, topToolbar, settings); assertEquals(1, leftToolbar.getChildrenCount()); AnAction actual = leftToolbar.getChildActionsOrStubs()[0]; assertEquals("Stop IDE Debugging. (Exit debug mode and continue the debug session later.)", actual.toString()); }
From source file:com.google.cloud.tools.intellij.debugger.CloudDebugProcessTest.java
License:Apache License
private void assertRemoveFromTopToolbar(String actionId) { ActionManager manager = ActionManager.getInstance(); AnAction action = manager.getAction(actionId); List<AnAction> topToolbarActions = Lists.newArrayList(); topToolbarActions.add(action);/*ww w. ja v a 2 s. c om*/ DefaultActionGroup topToolbar = new DefaultActionGroup(topToolbarActions); List<AnAction> actions = Lists.newArrayList(); DefaultActionGroup leftToolbar = new DefaultActionGroup(actions); DefaultActionGroup settings = new DefaultActionGroup(actions); process.registerAdditionalActions(leftToolbar, topToolbar, settings); assertEmpty(topToolbar.getChildActionsOrStubs()); }