List of usage examples for com.intellij.openapi.actionSystem ActionPlaces UNKNOWN
String UNKNOWN
To view the source code for com.intellij.openapi.actionSystem ActionPlaces UNKNOWN.
Click Source Link
From source file:altn8.ui.AbstractDataPanel.java
License:Apache License
/** * Init our Components/*www. j a va 2 s . c om*/ */ private void initUIComponents() { DefaultActionGroup actionGroup = new DefaultActionGroup(); // buttonAdd actionGroup.add(new AnAction("Add", "Add new item...", AllIcons.General.Add) { @Override public void actionPerformed(AnActionEvent e) { doAdd(); } @Override public void update(AnActionEvent e) { e.getPresentation().setEnabled(enabled); } }); // buttonRemove actionGroup.add(new AnAction("Remove", "Remove item...", AllIcons.General.Remove) { @Override public void actionPerformed(AnActionEvent e) { doRemove(); } @Override public void update(AnActionEvent e) { e.getPresentation().setEnabled(enabled && table.getSelectedRow() >= 0); } }); // buttonEdit actionGroup.add(new AnAction("Edit", "Edit item...", AllIcons.Actions.Edit) { @Override public void actionPerformed(AnActionEvent e) { doEdit(); } @Override public void update(AnActionEvent e) { e.getPresentation().setEnabled(enabled && table.getSelectedRow() >= 0); } }); // buttonCopy actionGroup.add(new AnAction("Copy", "Copy item...", AllIcons.Actions.Copy) { @Override public void actionPerformed(AnActionEvent e) { doCopy(); } @Override public void update(AnActionEvent e) { e.getPresentation().setEnabled(enabled && table.getSelectedRow() >= 0); } }); actionGroup.addSeparator(); // buttonMoveUp actionGroup.add(new AnAction("Move Up", "Move item up...", AllIcons.Actions.MoveUp) { @Override public void actionPerformed(AnActionEvent e) { doMove(true); } @Override public void update(AnActionEvent e) { e.getPresentation().setEnabled(enabled && table.getSelectedRow() > 0); } }); // buttonMoveDown actionGroup.add(new AnAction("Move Down", "Move item down...", AllIcons.Actions.MoveDown) { @Override public void actionPerformed(AnActionEvent e) { doMove(false); } @Override public void update(AnActionEvent e) { int selectedRow = table.getSelectedRow(); e.getPresentation().setEnabled( enabled && selectedRow >= 0 && selectedRow < (table.getModel().getRowCount() - 1)); } }); toolbar.add(ActionManager.getInstance().createActionToolbar(ActionPlaces.UNKNOWN, actionGroup, true) .getComponent()); }
From source file:com.android.tools.idea.actions.CreateClassAction.java
License:Apache License
private static void showOverridesDialog(@NotNull AnActionEvent event) { Editor editor = FileEditorManager.getInstance(event.getProject()).getSelectedTextEditor(); if (editor instanceof EditorEx) { EditorEx editorEx = (EditorEx) editor; AnActionEvent newEvent = new AnActionEvent(event.getInputEvent(), editorEx.getDataContext(), ActionPlaces.UNKNOWN, event.getPresentation(), event.getActionManager(), 0); ActionManager.getInstance().getAction("OverrideMethods").actionPerformed(newEvent); }/*from w w w .j a va 2 s. c o m*/ }
From source file:com.android.tools.idea.configurations.RenderOptionsMenuBuilder.java
License:Apache License
@NotNull public ActionToolbar build() { final ActionToolbar toolbar = ActionManager.getInstance().createActionToolbar(ActionPlaces.UNKNOWN, myGroup, true);//from w w w. j av a 2s .c om toolbar.setReservePlaceAutoPopupIcon(false); toolbar.setSecondaryActionsTooltip("Options"); return toolbar; }
From source file:com.android.tools.idea.editors.allocations.AllocationsView.java
License:Apache License
public AllocationsView(@NotNull Project project, @NotNull final AllocationInfo[] allocations) { myProject = project;/* w ww .j av a 2s . c o m*/ myAllocations = allocations; myGroupByName = PropertiesComponent.getInstance(project).getValue(ALLOCATION_VIEW_ID + GROUP_BY_NAME, GroupByMethod.NAME); myPackageFilter = new SearchTextFieldWithStoredHistory("alloc.package.filter"); myPackageFilter.addDocumentListener(new DocumentAdapter() { @Override protected void textChanged(DocumentEvent e) { myAlarm.cancelAllRequests(); myAlarm.addRequest(() -> setGroupByName(GroupByAllocator.NAME), 1000); } }); myTreeNode = generateTree(); myTreeModel = new DefaultTreeModel(myTreeNode); myAlarm = new Alarm(project); myTree = new Tree(myTreeModel); myTree.setRootVisible(false); myTree.setShowsRootHandles(true); myTree.putClientProperty(DataManager.CLIENT_PROPERTY_DATA_PROVIDER, this.new TreeDataProvider()); final DefaultActionGroup popupGroup = new DefaultActionGroup(); popupGroup.add(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); } }); myTree.addTreeExpansionListener(new TreeExpansionListener() { private boolean myIsCurrentlyExpanding = false; @Override public void treeExpanded(TreeExpansionEvent event) { if (myIsCurrentlyExpanding) { return; } myIsCurrentlyExpanding = true; // Do a fast expansion of descendant nodes if they only have one child each. AbstractTreeNode node = (AbstractTreeNode) event.getPath().getLastPathComponent(); AbstractTreeNode currentNode = node; int recursiveDepth = 0; List<Object> expandedPath = new ArrayList<>(Arrays.asList(event.getPath().getPath())); while (currentNode.getChildCount() == 1 && recursiveDepth < MAX_AUTO_EXPANSION_DEPTH) { AbstractTreeNode childNode = (AbstractTreeNode) currentNode.getChildAt(0); if (childNode.isLeaf()) { break; } expandedPath.add(childNode); currentNode = childNode; ++recursiveDepth; } if (node != currentNode) { myTree.expandPath(new TreePath(expandedPath.toArray())); } myIsCurrentlyExpanding = false; } @Override public void treeCollapsed(TreeExpansionEvent event) { } }); ColumnTreeBuilder builder = new ColumnTreeBuilder(myTree) .addColumn(new ColumnTreeBuilder.ColumnBuilder().setName("Method").setPreferredWidth(600) .setHeaderAlignment(SwingConstants.LEFT).setComparator((a, b) -> { if (a instanceof ThreadNode && b instanceof ThreadNode) { return ((ThreadNode) a).getThreadId() - ((ThreadNode) b).getThreadId(); } else if (a instanceof StackNode && b instanceof StackNode) { StackTraceElement ea = ((StackNode) a).getStackTraceElement(); StackTraceElement eb = ((StackNode) b).getStackTraceElement(); int value = ea.getMethodName().compareTo(eb.getMethodName()); if (value == 0) value = ea.getLineNumber() - eb.getLineNumber(); return value; } else { return a.getClass().toString().compareTo(b.getClass().toString()); } }).setRenderer(new NodeTreeCellRenderer())) .addColumn(new ColumnTreeBuilder.ColumnBuilder().setName("Count").setPreferredWidth(150) .setHeaderAlignment(SwingConstants.RIGHT) .setComparator((AbstractTreeNode a, AbstractTreeNode b) -> a.getCount() - b.getCount()) .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 ValuedTreeNode) { int v = ((ValuedTreeNode) value).getCount(); int total = myTreeNode.getCount(); setTextAlign(SwingConstants.RIGHT); append(String.valueOf(v)); append(String.format(" (%.2f%%)", 100.0f * v / total), new SimpleTextAttributes(STYLE_PLAIN, JBColor.GRAY)); } } })) .addColumn(new ColumnTreeBuilder.ColumnBuilder().setName("Total Size").setPreferredWidth(150) .setHeaderAlignment(SwingConstants.RIGHT).setInitialOrder(SortOrder.DESCENDING) .setComparator((AbstractTreeNode a, AbstractTreeNode b) -> a.getValue() - b.getValue()) .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 ValuedTreeNode) { int v = ((ValuedTreeNode) value).getValue(); int total = myTreeNode.getValue(); setTextAlign(SwingConstants.RIGHT); append(String.valueOf(v)); append(String.format(" (%.2f%%)", 100.0f * v / total), new SimpleTextAttributes(STYLE_PLAIN, JBColor.GRAY)); } } })); builder.setTreeSorter((Comparator<AbstractTreeNode> comparator, SortOrder sortOrder) -> { myTreeNode.sort(comparator); myTreeModel.nodeStructureChanged(myTreeNode); }); JComponent columnTree = builder.build(); mySplitter = new JBSplitter(true); new TreeSpeedSearch(myTree, e -> { Object o = e.getLastPathComponent(); if (o instanceof StackNode) { StackTraceElement ee = ((StackNode) o).getStackTraceElement(); return ee.toString(); } return o.toString(); }, true); JPanel panel = new JPanel(new BorderLayout()); JPanel topPanel = new JPanel(new BorderLayout()); ActionToolbar toolbar = ActionManager.getInstance().createActionToolbar(ActionPlaces.UNKNOWN, getMainActions(), true); topPanel.add(toolbar.getComponent(), BorderLayout.CENTER); myPackageFilter.setVisible(false); topPanel.add(myPackageFilter, BorderLayout.EAST); panel.add(topPanel, BorderLayout.NORTH); panel.add(columnTree, BorderLayout.CENTER); mySplitter.setFirstComponent(panel); myChartPane = new JPanel(new BorderLayout()); myLayout = new SunburstChart(myTreeNode); myLayout.setAngle(360.0f); myLayout.setAutoSize(true); myLayout.setSeparator(1.0f); myLayout.setGap(20.0f); myLayout.addSelectionListener(this); myLayout.setBorder(IdeBorderFactory.createBorder()); myLayout.setBackground(UIUtil.getTreeBackground()); Choreographer.animate(myLayout); toolbar = ActionManager.getInstance().createActionToolbar(ActionPlaces.UNKNOWN, getChartActions(), true); myChartOrientation = "Sunburst"; myChartUnit = "Size"; myChartPane = new JPanel(new BorderLayout()); myChartPane.add(toolbar.getComponent(), BorderLayout.NORTH); JBSplitter chartSplitter = new JBSplitter(); myChartPane.add(chartSplitter, BorderLayout.CENTER); chartSplitter.setFirstComponent(myLayout); if (PropertiesComponent.getInstance().getBoolean(ALLOCATION_VIEW_ID + SHOW_CHART_STATE, false)) { mySplitter.setSecondComponent(myChartPane); } JPanel infoPanel = new JPanel(new BorderLayout()); infoPanel.setBorder(IdeBorderFactory.createBorder()); myInfoLabel = new JLabel(); myInfoLabel.setBackground(UIUtil.getTreeBackground()); myInfoLabel.setOpaque(true); myInfoLabel.setVerticalAlignment(SwingConstants.TOP); infoPanel.add(myInfoLabel, BorderLayout.NORTH); myInfoTableModel = new DefaultTableModel() { @Override public boolean isCellEditable(int i, int i1) { return false; } }; myInfoTableModel.addColumn("Data"); myInfoTable = new JBTable(myInfoTableModel); myInfoTable.putClientProperty(DataManager.CLIENT_PROPERTY_DATA_PROVIDER, this.new TableDataProvider()); myInfoTable.addMouseListener(new PopupHandler() { @Override public void invokePopup(Component comp, int x, int y) { ActionManager.getInstance().createActionPopupMenu(ActionPlaces.UNKNOWN, popupGroup).getComponent() .show(comp, x, y); } @Override public void mousePressed(MouseEvent e) { super.mousePressed(e); if (e.getClickCount() == 2) { Object value = myInfoTable.getValueAt(myInfoTable.getSelectedRow(), 0); if (value instanceof TreeNode) { TreeNode[] nodes = myTreeModel.getPathToRoot((TreeNode) value); TreePath path = new TreePath(nodes); myTree.setSelectionPath(path); myTree.scrollPathToVisible(path); } } } }); myInfoTable.setTableHeader(null); myInfoTable.setShowGrid(false); myInfoTable.setDefaultRenderer(Object.class, new NodeTableCellRenderer()); JBScrollPane scroll = new JBScrollPane(myInfoTable); scroll.setBorder(BorderFactory.createEmptyBorder()); infoPanel.add(scroll, BorderLayout.CENTER); chartSplitter.setSecondComponent(infoPanel); chartSplitter.setProportion(0.7f); myComponent = mySplitter; setGroupByName(myGroupByName); }
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 ww . jav a 2 s.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;/*from w w w .j a va 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 ww . j av a 2 s .c o m 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 ww. ja 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;/*w ww . ja v 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.editors.strings.StringResourceViewPanel.java
License:Apache License
private ActionToolbar createToolbar() { DefaultActionGroup group = new DefaultActionGroup(); final ActionToolbar toolbar = ActionManager.getInstance().createActionToolbar(ActionPlaces.UNKNOWN, group, true);/*from w ww . j ava 2 s.co m*/ final AnAction addKeyAction = new AnAction("Add Key", "", AllIcons.ToolbarDecorator.Add) { @Override public void update(AnActionEvent e) { e.getPresentation().setEnabled(myTable.getData() != null); } @Override public void actionPerformed(AnActionEvent e) { StringResourceData data = myTable.getData(); assert data != null; NewStringKeyDialog dialog = new NewStringKeyDialog(myFacet, ImmutableSet.copyOf(data.getKeys())); if (dialog.showAndGet()) { StringsWriteUtils.createItem(myFacet, dialog.getResFolder(), null, dialog.getKey(), dialog.getDefaultValue(), true); } } }; group.add(addKeyAction); group.add(new RemoveKeysAction()); group.add(new AddLocaleAction(toolbar.getComponent())); group.add(newShowOnlyKeysNeedingTranslationsAction()); group.add(new BrowserHelpAction("Translations editor", "https://developer.android.com/r/studio-ui/translations-editor.html")); return toolbar; }