1 package com.intellij.ide.util.treeView;
3 import com.intellij.openapi.util.ActionCallback;
4 import com.intellij.openapi.util.Condition;
5 import com.intellij.openapi.util.Disposer;
6 import com.intellij.openapi.util.Ref;
7 import com.intellij.ui.TreeUIHelper;
8 import com.intellij.ui.speedSearch.ElementFilter;
9 import com.intellij.ui.treeStructure.*;
10 import com.intellij.ui.treeStructure.filtered.FilteringTreeBuilder;
11 import com.intellij.ui.treeStructure.filtered.FilteringTreeStructure;
13 import java.util.LinkedHashMap;
15 public class FilteringTreeBuilderTest extends BaseTreeTestCase {
16 private FilteringTreeBuilder myBuilder;
17 private MyFilter myFilter;
19 private SimpleTreeStructure myStructure;
21 public FilteringTreeBuilderTest() {
26 protected void setUp() throws Exception {
28 myTree = new SimpleTree() {
30 protected void configureUiHelper(final TreeUIHelper helper) {
34 myFilter = new MyFilter();
35 myRoot = new Node(null, "/");
36 myStructure = new SimpleTreeStructure.Impl(myRoot);
39 private void initBuilder() throws Exception {
40 myBuilder = new FilteringTreeBuilder(null, myTree, myFilter, myStructure, AlphaComparator.INSTANCE) {
42 protected AbstractTreeUpdater createUpdater() {
43 return _createUpdater(this);
49 Disposer.register(getRootDisposable(), myBuilder);
52 public void testFilter() throws Exception {
53 myTree.setRootVisible(false);
55 final Node f1 = myRoot.addChild("folder1");
56 f1.addChild("file11");
57 f1.addChild("file12");
58 Node f11 = f1.addChild("folder11");
59 f11.addChild("element111");
60 myRoot.addChild("folder2").addChild("file21");
73 update("", findNode("file11"));
112 select("element111");
122 update("folder2", null);
136 update("file1", null);
160 private void select(String element) throws Exception {
161 FilteringTreeStructure.Node node = myBuilder.getVisibleNodeFor(findNode(element));
162 select(new Object[] {node}, false);
165 private void update(final String text, final Object selection) throws Exception {
166 final ActionCallback result = new ActionCallback();
167 doAndWaitForBuilder(new Runnable() {
169 myFilter.update(text, selection).notify(result);
171 }, new Condition<Object>() {
172 public boolean value(Object o) {
173 return result.isProcessed();
178 private class Node extends CachingSimpleNode {
180 private final LinkedHashMap<String, Node> myKids = new LinkedHashMap<String, Node>();
182 private Node(final SimpleNode aParent, String name) {
187 public Node addChild(String name) {
188 if (!myKids.containsKey(name)) {
189 myKids.put(name, new Node(this, name));
192 return myKids.get(name);
196 protected void doUpdate() {
197 setPlainText(myName);
200 protected SimpleNode[] buildChildren() {
201 return myKids.values().toArray(new Node[myKids.size()]);
205 public String toString() {
210 protected void updateFileStatus() {
215 private Object findNode(final String name) {
216 final Ref<Object> node = new Ref<Object>();
217 ((SimpleTree)myTree).accept(myBuilder, new SimpleNodeVisitor() {
218 public boolean accept(final SimpleNode simpleNode) {
219 if (name.equals(simpleNode.toString())) {
220 node.set(myBuilder.getOriginalNode(simpleNode));
232 private class MyFilter extends ElementFilter.Active.Impl {
234 String myPattern = "";
236 public boolean shouldBeShowing(final Object value) {
237 return value.toString().startsWith(myPattern);
240 public ActionCallback update(final String pattern, Object selection) {
242 return fireUpdate(selection, true, false);
247 AbstractTreeBuilder getBuilder() {