JComponent () { myTreeView = new SMTRunnerTestTreeView(); myTreeView.setLargeModel(true); myTreeView.attachToModel(this); myTreeView.setTestResultsViewer(this); final SMTRunnerTreeStructure structure = new SMTRunnerTreeStructure(myProject, myTestsRootNode); myTreeBuilder = new SMTRunnerTreeBuilder(myTreeView, structure); StructureTreeModel structureTreeModel = new StructureTreeModel<>(structure, IndexComparator.INSTANCE, myProject); AsyncTreeModel asyncTreeModel = new AsyncTreeModel(structureTreeModel, true, myProject); myTreeView.setModel(asyncTreeModel); myTreeBuilder.setModel(structureTreeModel); myTreeBuilder.setTestsComparator(this); Disposer.register(this, myTreeBuilder); Disposer.register(this, asyncTreeModel); TrackRunningTestUtil.installStopListeners(myTreeView, myProperties, testProxy -> { if (testProxy == null) return; setLastSelected(testProxy); //ensure scroll to source on explicit selection only if (ScrollToTestSourceAction.isScrollEnabled(this)) { ReadAction .nonBlocking(() -> TestsUIUtil.getOpenFileDescriptor(testProxy, this)) .finishOnUiThread(ModalityState.nonModal(), descriptor -> { if (descriptor != null) { OpenSourceUtil.navigate(false, descriptor); } }) .expireWith(this) .submit(AppExecutorUtil.getAppExecutorService()); } }); //TODO always hide root node //myTreeView.setRootVisible(false); return myTreeView; }