JScrollPane () { fillTreeData(null, true); final InspectionsConfigTreeRenderer renderer = new InspectionsConfigTreeRenderer(){ @Override protected String getFilter() { return myProfileFilter != null ? myProfileFilter.getFilter() : null; } }; myTreeTable = InspectionsConfigTreeTable.create(new InspectionsConfigTreeTable.InspectionsConfigTreeTableSettings(myRoot, getProject()) { @Override protected void onChanged(@NotNull final InspectionConfigTreeNode node) { InspectionConfigTreeNode.updateUpHierarchy(node); } @Override public void updateRightPanel() { updateOptionsAndDescriptionPanel(); } @Override @NotNull public InspectionProfileImpl getInspectionProfile() { return myProfile; } }, myDisposable); myTreeTable.setTreeCellRenderer(renderer); myTreeTable.setRootVisible(false); updateEmptyText(); final TreeTableTree tree = myTreeTable.getTree(); tree.putClientProperty(DefaultTreeUI.LARGE_MODEL_ALLOWED, true); tree.setRowHeight(renderer.getTreeCellRendererComponent(tree, "xxx", true, true, false, 0, true).getPreferredSize().height); tree.setLargeModel(true); tree.addTreeSelectionListener(__ -> { if (myTreeTable.getTree().getSelectionPaths() != null) { updateOptionsAndDescriptionPanel(); } else { initOptionsAndDescriptionPanel(); } if (!myIsInRestore) { if (!isDisposed()) { InspectionProfileImpl baseProfile = myProfile.getSource(); getExpandedNodes(baseProfile).setSelectionPaths(myTreeTable.getTree().getSelectionPaths()); getExpandedNodes(myProfile).setSelectionPaths(myTreeTable.getTree().getSelectionPaths()); } } }); myTreeTable.addMouseListener(new PopupHandler() { @Override public void invokePopup(Component comp, int x, int y) { final TreeTableTree tree = myTreeTable.getTree(); final int[] selectionRows = tree.getSelectionRows(); if (selectionRows != null && tree.getPathForLocation(x, y) != null && Arrays.binarySearch(selectionRows, tree.getRowForLocation(x, y)) > -1) { compoundPopup().show(comp, x, y); } } }); TreeSpeedSearch.installOn(tree, false, o -> { final InspectionConfigTreeNode node = (InspectionConfigTreeNode)o.getLastPathComponent(); return InspectionsConfigTreeComparator.getDisplayTextToSort(node.getText()); }); final JScrollPane scrollPane = ScrollPaneFactory.createScrollPane(myTreeTable); tree.setShowsRootHandles(true); scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); TreeUtil.collapseAll(tree, 1); tree.addTreeExpansionListener(new TreeExpansionListener() { @Override public void treeCollapsed(TreeExpansionEvent event) { InspectionProfileModifiableModel selected = myProfile; getExpandedNodes(selected.getSource()).saveVisibleState(myTreeTable.getTree()); getExpandedNodes(selected).saveVisibleState(myTreeTable.getTree()); } @Override public void treeExpanded(TreeExpansionEvent event) { if (!isDisposed()) { final InspectionConfigTreeNode node = (InspectionConfigTreeNode)event.getPath().getLastPathComponent(); getExpandedNodes(myProfile.getSource()).expandNode(node); getExpandedNodes(myProfile).expandNode(node); } } }); myTreeExpander = new DefaultTreeTableExpander(myTreeTable); myProfileFilter = new MyFilterComponent(); return scrollPane; }