private JScrollPane initTreeScrollPane() {
    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;
  }
private JScrollPane initTreeScrollPane()