protected void installSpeedSearch() { final TreeSpeedSearch treeSpeedSearch = new TreeSpeedSearch( myTree, new Convertor<TreePath, String>() { @Override @Nullable public String convert(TreePath path) { final ElementNode lastPathComponent = (ElementNode) path.getLastPathComponent(); if (lastPathComponent == null) return null; String text = lastPathComponent.getDelegate().getText(); if (text != null) { int i = text.indexOf(':'); if (i >= 0) { text = text.substring(0, i); } i = text.indexOf('('); if (i >= 0) { text = text.substring(0, i); } } return text; } }); treeSpeedSearch.setComparator(getSpeedSearchComparator()); treeSpeedSearch.addChangeListener( new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { myTree.repaint(); // to update match highlighting } }); }
public FileStructurePopup( StructureViewModel structureViewModel, @Nullable Editor editor, Project project, @NotNull final Disposable auxDisposable, final boolean applySortAndFilter) { myProject = project; myEditor = editor; // Stop code analyzer to speedup EDT final DaemonCodeAnalyzer analyzer = DaemonCodeAnalyzer.getInstance(myProject); if (analyzer != null) { myDaemonUpdateEnabled = ((DaemonCodeAnalyzerImpl) analyzer).isUpdateByTimerEnabled(); analyzer.setUpdateByTimerEnabled(false); } else { myDaemonUpdateEnabled = false; } IdeFocusManager.getInstance(myProject).typeAheadUntil(myTreeHasBuilt); myBaseTreeModel = structureViewModel; Disposer.register(this, auxDisposable); if (applySortAndFilter) { myTreeActionsOwner = new TreeStructureActionsOwner(myBaseTreeModel); myTreeModel = new TreeModelWrapper(structureViewModel, myTreeActionsOwner); } else { myTreeActionsOwner = null; myTreeModel = structureViewModel; } myTreeStructure = new SmartTreeStructure(project, myTreeModel) { public void rebuildTree() { if (ApplicationManager.getApplication().isUnitTestMode() || !myPopup.isDisposed()) { super.rebuildTree(); } } public boolean isToBuildChildrenInBackground(final Object element) { return getRootElement() == element; } protected TreeElementWrapper createTree() { return new StructureViewComponent.StructureViewTreeElementWrapper( myProject, myModel.getRoot(), myModel); } @Override public String toString() { return "structure view tree structure(model=" + myTreeModel + ")"; } }; myTree = new FileStructureTree( myTreeStructure.getRootElement(), Registry.is("fast.tree.expand.in.structure.view")); myTree.setCellRenderer( new NodeRenderer() { @Override protected void doAppend( @NotNull @Nls String fragment, @NotNull SimpleTextAttributes attributes, boolean isMainText, boolean selected) { SpeedSearchUtil.appendFragmentsForSpeedSearch( myTree, fragment, attributes, selected, this); } @Override public void doAppend( @NotNull String fragment, @NotNull SimpleTextAttributes attributes, boolean selected) { SpeedSearchUtil.appendFragmentsForSpeedSearch( myTree, fragment, attributes, selected, this); } @Override public void doAppend(String fragment, boolean selected) { SpeedSearchUtil.appendFragmentsForSpeedSearch( myTree, fragment, SimpleTextAttributes.REGULAR_ATTRIBUTES, selected, this); } }); mySpeedSearch = new MyTreeSpeedSearch(); mySpeedSearch.setComparator(new SpeedSearchComparator(false, true)); final FileStructurePopupFilter filter = new FileStructurePopupFilter(); myFilteringStructure = new FilteringTreeStructure( filter, myTreeStructure, ApplicationManager.getApplication().isUnitTestMode()); myAbstractTreeBuilder = new FilteringTreeBuilder(myTree, filter, myFilteringStructure, null) { @Override public void initRootNode() {} @Override protected boolean validateNode(Object child) { return StructureViewComponent.isValid(child); } @Override public void revalidateTree() { // myTree.revalidate(); // myTree.repaint(); } @Override public boolean isToEnsureSelectionOnFocusGained() { return false; } }; myTreeExpander = new DefaultTreeExpander(myTree); // myAbstractTreeBuilder.getUi().setPassthroughMode(true); myAbstractTreeBuilder.getUi().getUpdater().setDelay(1); myInitialPsiElement = getCurrentElement(getPsiFile(myProject)); // myAbstractTreeBuilder.setCanYieldUpdate(true); Disposer.register(this, myAbstractTreeBuilder); }