/* * Copyright 2000-2015 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.intellij.testFramework; import com.intellij.ide.actions.ViewStructureAction; import com.intellij.ide.util.FileStructurePopup; import com.intellij.openapi.Disposable; import com.intellij.openapi.fileEditor.impl.text.TextEditorProvider; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.Ref; import com.intellij.psi.PsiFile; import com.intellij.testFramework.fixtures.CodeInsightTestFixture; import com.intellij.ui.treeStructure.Tree; import com.intellij.ui.treeStructure.filtered.FilteringTreeBuilder; import com.intellij.ui.treeStructure.filtered.FilteringTreeStructure; import com.intellij.util.ui.tree.TreeUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; /** * @author Konstantin Bulenkov */ public class FileStructureTestFixture implements Disposable { private final CodeInsightTestFixture myFixture; private FileStructurePopup myPopup; private PsiFile myFile; public FileStructureTestFixture(@NotNull CodeInsightTestFixture fixture) { myFixture = fixture; } @Nullable public FilteringTreeStructure.FilteringNode update() { final Ref<FilteringTreeStructure.FilteringNode> nodeRef = new Ref<>(); final FileStructurePopup popup = getPopup(); popup.getTreeBuilder().refilter().doWhenProcessed(() -> { getStructure().rebuild(); updateTree(); getBuilder().updateFromRoot(); TreeUtil.expandAll(getTree()); nodeRef.set(popup.selectPsiElement(popup.getCurrentElement(myFile))); getBuilder().getUi().select(nodeRef.get(), null); }); return nodeRef.get(); } public Tree getTree() { return getPopup().getTree(); } public FilteringTreeBuilder getBuilder() { return getPopup().getTreeBuilder(); } public FileStructurePopup.MyTreeSpeedSearch getSpeedSearch() { return (FileStructurePopup.MyTreeSpeedSearch)getPopup().getSpeedSearch(); } public void updateTree() { updateRecursively(getRootNode()); } public FilteringTreeStructure getStructure() { final FilteringTreeStructure structure = (FilteringTreeStructure)getBuilder().getTreeStructure(); assert structure != null; return structure; } public FilteringTreeStructure.FilteringNode getRootNode() { return getStructure().getRootElement(); } public void updateRecursively(final FilteringTreeStructure.FilteringNode node) { node.update(); for (FilteringTreeStructure.FilteringNode child : node.children()) { updateRecursively(child); } } @NotNull public FileStructurePopup getPopup() { if (myPopup == null || myFile != myFixture.getFile()) { if (myPopup != null) { Disposer.dispose(myPopup); myPopup = null; } myFile = myFixture.getFile(); myPopup = ViewStructureAction.createPopup(myFixture.getProject(), TextEditorProvider.getInstance().getTextEditor(myFixture.getEditor())); assert myPopup != null; Disposer.register(this, myPopup); myPopup.createCenterPanel(); myPopup.getTreeBuilder().getUi().getUpdater().setPassThroughMode(true); } return myPopup; } @Override public void dispose() { myPopup = null; myFile = null; } }