--- /dev/null
+package com.intellij.projectView;
+
+import com.intellij.ide.projectView.PresentationData;
+import com.intellij.ide.projectView.ProjectViewNode;
+import com.intellij.ide.projectView.TreeStructureProvider;
+import com.intellij.ide.projectView.ViewSettings;
+import com.intellij.ide.util.treeView.AbstractTreeNode;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiFile;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+
+class ClassNameConvertor implements TreeStructureProvider {
+
+ private final Project myProject;
+
+ public ClassNameConvertor(Project project) {
+ myProject = project;
+ }
+
+ public Collection<AbstractTreeNode> modify(AbstractTreeNode parent, Collection<AbstractTreeNode> children, ViewSettings settings) {
+ ArrayList<AbstractTreeNode> result = new ArrayList<AbstractTreeNode>();
+
+ for (final AbstractTreeNode aChildren : children) {
+ ProjectViewNode treeNode = (ProjectViewNode)aChildren;
+ Object o = treeNode.getValue();
+ if (o instanceof PsiFile && ((PsiFile)o).getVirtualFile().getExtension().equals("java")) {
+ final String name = ((PsiFile)o).getName();
+ ProjectViewNode viewNode = new ProjectViewNode<PsiFile>(myProject, (PsiFile)o, settings) {
+ @NotNull
+ public Collection<AbstractTreeNode> getChildren() {
+ return Collections.emptyList();
+ }
+
+ public String getTestPresentation() {
+ return name + " converted";
+ }
+
+ public boolean contains(@NotNull VirtualFile file) {
+ return false;
+ }
+
+ public void update(PresentationData presentation) {
+ }
+
+ };
+ result.add(viewNode);
+ }
+ else {
+ result.add(treeNode);
+ }
+ }
+ return result;
+ }
+
+ public Object getData(Collection<AbstractTreeNode> selected, String dataName) {
+ return null;
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2004 JetBrains s.r.o. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * -Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * -Redistribution in binary form must reproduct the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the distribution.
+ *
+ * Neither the name of JetBrains or IntelliJ IDEA
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
+ * ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+ * OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. JETBRAINS AND ITS LICENSORS SHALL NOT
+ * BE LIABLE FOR ANY DAMAGES OR LIABILITIES SUFFERED BY LICENSEE AS A RESULT
+ * OF OR RELATING TO USE, MODIFICATION OR DISTRIBUTION OF THE SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL JETBRAINS OR ITS LICENSORS BE LIABLE FOR ANY LOST
+ * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
+ * INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY
+ * OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE SOFTWARE, EVEN
+ * IF JETBRAINS HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ */
+package com.intellij.projectView;
+
+import com.intellij.ide.actions.ViewStructureAction;
+import com.intellij.ide.commander.CommanderPanel;
+import com.intellij.ide.structureView.StructureViewBuilder;
+import com.intellij.ide.structureView.StructureViewModel;
+import com.intellij.ide.structureView.TreeBasedStructureViewBuilder;
+import com.intellij.ide.util.FileStructureDialog;
+import com.intellij.openapi.Disposable;
+import com.intellij.openapi.editor.Editor;
+import com.intellij.openapi.editor.EditorFactory;
+import com.intellij.openapi.fileEditor.FileDocumentManager;
+import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.psi.JavaDirectoryService;
+import com.intellij.psi.PsiClass;
+
+public class FileStructureDialogTest extends BaseProjectViewTestCase {
+ public void testFileStructureForClass() throws Exception {
+ final PsiClass psiClass = JavaDirectoryService.getInstance().getPackage(getPackageDirectory()).getClasses()[0];
+ final VirtualFile virtualFile = psiClass.getContainingFile().getVirtualFile();
+ final StructureViewBuilder structureViewBuilder =
+ StructureViewBuilder.PROVIDER.getStructureViewBuilder(virtualFile.getFileType(), virtualFile, myProject);
+ final StructureViewModel structureViewModel = ((TreeBasedStructureViewBuilder)structureViewBuilder).createStructureViewModel();
+
+ Editor editor = null;
+ FileStructureDialog dialog = null;
+ try {
+ editor = EditorFactory.getInstance().createEditor(FileDocumentManager.getInstance().getDocument(virtualFile));
+ dialog = ViewStructureAction.createStructureViewBasedDialog(structureViewModel, editor, myProject, psiClass, new Disposable() {
+ public void dispose() {
+ structureViewModel.dispose();
+ }
+ });
+ final CommanderPanel panel = dialog.getPanel();
+ assertListsEqual(panel.getModel(), "Inner1\n" + "Inner2\n" + "__method():void\n" + "_myField1:int\n" + "_myField2:String\n");
+ }
+ finally {
+ if (dialog != null) dialog.close(0);
+ if (editor != null) EditorFactory.getInstance().releaseEditor(editor);
+ }
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2004 JetBrains s.r.o. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * -Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * -Redistribution in binary form must reproduct the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the distribution.
+ *
+ * Neither the name of JetBrains or IntelliJ IDEA
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
+ * ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+ * OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. JETBRAINS AND ITS LICENSORS SHALL NOT
+ * BE LIABLE FOR ANY DAMAGES OR LIABILITIES SUFFERED BY LICENSEE AS A RESULT
+ * OF OR RELATING TO USE, MODIFICATION OR DISTRIBUTION OF THE SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL JETBRAINS OR ITS LICENSORS BE LIABLE FOR ANY LOST
+ * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
+ * INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY
+ * OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE SOFTWARE, EVEN
+ * IF JETBRAINS HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ */
+package com.intellij.projectView;
+
+import com.intellij.ide.structureView.impl.java.InheritedMembersFilter;
+import com.intellij.ide.structureView.impl.java.PublicElementsFilter;
+import com.intellij.ide.structureView.impl.java.VisibilitySorter;
+import com.intellij.ide.structureView.newStructureView.StructureViewComponent;
+import com.intellij.testFramework.IdeaTestUtil;
+import com.intellij.openapi.fileEditor.FileEditor;
+import com.intellij.openapi.fileEditor.FileEditorManager;
+import com.intellij.openapi.util.Disposer;
+import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.psi.JavaDirectoryService;
+import com.intellij.psi.PsiClass;
+import com.intellij.testFramework.TestSourceBasedTestCase;
+
+import javax.swing.*;
+
+public class JavaTreeStructureTest extends TestSourceBasedTestCase {
+ protected String getTestPath() {
+ return "structureView";
+ }
+
+ public void testJavaClassStructure() throws Exception {
+ dotest(new CheckAction() {
+ public void testClassStructure(StructureViewComponent structureViewComponent) {
+ IdeaTestUtil.assertTreeEqual(structureViewComponent.getTree(), "-Class1.java\n" +
+ " -Class1\n" +
+ " getValue():int\n" +
+ " hashCode():int\n" +
+ " finalize():void\n" +
+ " notify():void\n" +
+ " notifyAll():void\n" +
+ " wait():void\n" +
+ " wait(long):void\n" +
+ " wait(long, int):void\n" +
+ " getClass():Class\n" +
+ " clone():Object\n" +
+ " equals(Object):boolean\n" +
+ " toString():String\n" +
+ " myField1:boolean\n" +
+ " myField2:boolean\n");
+
+ structureViewComponent.setActionActive(InheritedMembersFilter.ID, true);
+ structureViewComponent.setActionActive(InheritedMembersFilter.ID, false);
+ structureViewComponent.setActionActive(InheritedMembersFilter.ID, true);
+
+ IdeaTestUtil.assertTreeEqual(structureViewComponent.getTree(), "-Class1.java\n" +
+ " -Class1\n" +
+ " getValue():int\n" +
+ " myField1:boolean\n" +
+ " myField2:boolean\n");
+
+ structureViewComponent.setActionActive(PublicElementsFilter.ID, true);
+
+ IdeaTestUtil.assertTreeEqual(structureViewComponent.getTree(), "-Class1.java\n" +
+ " -Class1\n" +
+ " getValue():int\n" +
+ " myField1:boolean\n" +
+ " myField2:boolean\n");
+
+ structureViewComponent.setActionActive(PublicElementsFilter.ID, false);
+
+ IdeaTestUtil.assertTreeEqual(structureViewComponent.getTree(), "-Class1.java\n" +
+ " -Class1\n" +
+ " getValue():int\n" +
+ " myField1:boolean\n" +
+ " myField2:boolean\n");
+ }
+ });
+ }
+
+ public void testShowClassMembers() throws Exception {
+ dotest(new CheckAction() {
+ public void testClassStructure(StructureViewComponent structureViewComponent) {
+ final JTree tree = structureViewComponent.getTree();
+ tree.collapseRow(2);
+ IdeaTestUtil.assertTreeEqual(tree, "-Class2.java\n" +
+ " -Class2\n" +
+ " +InnerClass1\n" +
+ " +InnerClass2\n" +
+ " getValue():int\n" +
+ " hashCode():int\n" +
+ " finalize():void\n" +
+ " notify():void\n" +
+ " notifyAll():void\n" +
+ " wait():void\n" +
+ " wait(long):void\n" +
+ " wait(long, int):void\n" +
+ " getClass():Class\n" +
+ " clone():Object\n" +
+ " equals(Object):boolean\n" +
+ " toString():String\n" +
+ " myField1:boolean\n" +
+ " myField2:boolean\n" +
+ " myField3:boolean\n" +
+ " myField4:boolean\n");
+
+ structureViewComponent.setActionActive(InheritedMembersFilter.ID, true);
+
+ IdeaTestUtil.assertTreeEqual(structureViewComponent.getTree(), "-Class2.java\n" +
+ " -Class2\n" +
+ " +InnerClass1\n" +
+ " +InnerClass2\n" +
+ " getValue():int\n" +
+ " myField1:boolean\n" +
+ " myField2:boolean\n" +
+ " myField3:boolean\n" +
+ " myField4:boolean\n");
+ }
+ });
+ }
+
+ public void _testVisibilitySorter() throws Exception {
+ dotest(new CheckAction() {
+ public void testClassStructure(StructureViewComponent structureViewComponent) {
+ structureViewComponent.setActionActive(InheritedMembersFilter.ID, true);
+
+ IdeaTestUtil.assertTreeEqual(structureViewComponent.getTree(), "-Class2.java\n" +
+ " -Class2\n" +
+ " __myPrivateFiield:int\n" +
+ " _myProtectedField:int\n" +
+ " myPublicField:int\n");
+
+ structureViewComponent.setActionActive(VisibilitySorter.ID, true);
+
+ IdeaTestUtil.assertTreeEqual(structureViewComponent.getTree(), "-Class2.java\n" +
+ " -Class2\n" +
+ " myPublicField:int\n" +
+ " _myProtectedField:int\n" +
+ " __myPrivateFiield:int\n");
+ }
+ });
+ }
+
+ public void testMembersOrder() throws Exception {
+ dotest(new CheckAction() {
+ public void testClassStructure(StructureViewComponent structureViewComponent) {
+ structureViewComponent.setActionActive(InheritedMembersFilter.ID, true);
+
+ IdeaTestUtil.assertTreeEqual(structureViewComponent.getTree(), "-Class2.java\n" +
+ " -Class2\n" +
+ " Class2()\n" +
+ " af():void\n" +
+ " zf():void\n" +
+ " ab:int\n" +
+ " z:int\n"
+ );
+ }
+ });
+ }
+ interface CheckAction {
+ void testClassStructure(StructureViewComponent structureViewComponent);
+ }
+ private void dotest(CheckAction checkAction) throws Exception {
+ final PsiClass psiClass = JavaDirectoryService.getInstance().getClasses(getPackageDirectory("com/package1"))[0];
+ final VirtualFile virtualFile = psiClass.getContainingFile().getVirtualFile();
+ final FileEditorManager fileEditorManager = FileEditorManager.getInstance(myProject);
+ FileEditor[] fileEditors = fileEditorManager.openFile(virtualFile, false);
+ final FileEditor fileEditor = fileEditors[0];
+ try {
+ final StructureViewComponent structureViewComponent =
+ (StructureViewComponent)fileEditor.getStructureViewBuilder().createStructureView(fileEditor, myProject);
+
+ checkAction.testClassStructure(structureViewComponent);
+ Disposer.dispose(structureViewComponent);
+
+ }
+ finally {
+ fileEditorManager.closeFile(virtualFile);
+ }
+ }
+
+}
--- /dev/null
+/*
+ * Copyright (c) 2004 JetBrains s.r.o. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * -Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * -Redistribution in binary form must reproduct the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the distribution.
+ *
+ * Neither the name of JetBrains or IntelliJ IDEA
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
+ * ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+ * OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. JETBRAINS AND ITS LICENSORS SHALL NOT
+ * BE LIABLE FOR ANY DAMAGES OR LIABILITIES SUFFERED BY LICENSEE AS A RESULT
+ * OF OR RELATING TO USE, MODIFICATION OR DISTRIBUTION OF THE SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL JETBRAINS OR ITS LICENSORS BE LIABLE FOR ANY LOST
+ * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
+ * INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY
+ * OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE SOFTWARE, EVEN
+ * IF JETBRAINS HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ */
+package com.intellij.projectView;
+
+import com.intellij.ide.projectView.impl.AbstractProjectViewPSIPane;
+import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.psi.JavaDirectoryService;
+import com.intellij.psi.PsiClass;
+import com.intellij.psi.PsiFile;
+import com.intellij.psi.PsiJavaFile;
+import com.intellij.testFramework.IdeaTestUtil;
+
+import javax.swing.*;
+import java.io.IOException;
+
+@SuppressWarnings({"HardCodedStringLiteral"})
+public class NavigateFromSourceTest extends BaseProjectViewTestCase {
+ public void testShowClassMembers() throws Exception {
+ useStandardProviders();
+ PsiClass psiClass = JavaDirectoryService.getInstance().getClasses(getPackageDirectory())[0];
+
+ final AbstractProjectViewPSIPane pane = createPane();
+ final PsiFile containingFile = psiClass.getContainingFile();
+ final VirtualFile virtualFile = containingFile.getVirtualFile();
+
+ checkNavigateFromSourceBehaviour(psiClass, virtualFile, pane);
+
+ IdeaTestUtil.assertTreeEqual(pane.getTree(), "-Project\n" +
+ " -PsiDirectory: showClassMembers\n" +
+ " -PsiDirectory: src\n" +
+ " -PsiDirectory: com\n" +
+ " -PsiDirectory: package1\n" +
+ " [Class1]\n" +
+ " Class2\n" +
+ getRootFiles() +
+ " +External Libraries\n"
+ , true);
+
+ changeClassTextAndTryToNavigate("class Class11 {}", (PsiJavaFile)containingFile, pane, "-Project\n" +
+ " -PsiDirectory: showClassMembers\n" +
+ " -PsiDirectory: src\n" +
+ " -PsiDirectory: com\n" +
+ " -PsiDirectory: package1\n" +
+ " [Class11]\n" +
+ " Class2\n" +
+ getRootFiles() +
+ " +External Libraries\n");
+
+ changeClassTextAndTryToNavigate("class Class1 {}", (PsiJavaFile)containingFile, pane, "-Project\n" +
+ " -PsiDirectory: showClassMembers\n" +
+ " -PsiDirectory: src\n" +
+ " -PsiDirectory: com\n" +
+ " -PsiDirectory: package1\n" +
+ " [Class1]\n" +
+ " Class2\n" +
+ getRootFiles() +
+ " +External Libraries\n");
+
+ doTestMultipleSelection(pane, ((PsiJavaFile)containingFile).getClasses()[0]);
+ }
+
+ private static void doTestMultipleSelection(final AbstractProjectViewPSIPane pane, final PsiClass psiClass) {
+ JTree tree = pane.getTree();
+ int rowCount = tree.getRowCount();
+ for (int i = 0; i < rowCount; i++) {
+ tree.addSelectionRow(i);
+ }
+
+ pane.select(psiClass, psiClass.getContainingFile().getVirtualFile(), true);
+
+ assertEquals(1, tree.getSelectionCount());
+ }
+
+ private void changeClassTextAndTryToNavigate(final String newClassString,
+ PsiJavaFile psiFile,
+ final AbstractProjectViewPSIPane pane,
+ final String expected) throws IOException, InterruptedException {
+ PsiClass psiClass = psiFile.getClasses()[0];
+ final VirtualFile virtualFile = psiClass.getContainingFile().getVirtualFile();
+ final JTree tree = pane.getTree();
+ writeToFile(virtualFile, newClassString.getBytes());
+
+ IdeaTestUtil.waitForAlarm(600);
+
+ pane.select(psiClass, virtualFile, true);
+ IdeaTestUtil.assertTreeEqual(tree, expected, true);
+ }
+
+ private static void writeToFile(final VirtualFile virtualFile, final byte[] b) throws IOException {
+ virtualFile.setBinaryContent(b);
+ }
+
+
+}
--- /dev/null
+package com.intellij.projectView;
+
+import com.intellij.ide.projectView.impl.AbstractProjectViewPSIPane;
+import com.intellij.ide.structureView.impl.java.InheritedMembersFilter;
+import com.intellij.ide.structureView.newStructureView.StructureViewComponent;
+import com.intellij.openapi.fileEditor.FileEditor;
+import com.intellij.openapi.fileEditor.FileEditorManager;
+import com.intellij.openapi.util.Disposer;
+import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.psi.JavaDirectoryService;
+import com.intellij.psi.PsiClass;
+import com.intellij.psi.PsiField;
+import com.intellij.psi.PsiFile;
+import com.intellij.testFramework.IdeaTestUtil;
+import com.intellij.util.IncorrectOperationException;
+import com.intellij.util.ui.tree.TreeUtil;
+
+import java.io.IOException;
+
+public class ProjectTreeBuilderTest extends BaseProjectViewTestCase {
+ public void testStandardProviders() throws Exception {
+ getProjectTreeStructure().setProviders();
+
+ final PsiClass aClass = JavaDirectoryService.getInstance().getClasses(getPackageDirectory())[0];
+
+ PsiFile element = aClass.getContainingFile();
+
+ checkNavigateFromSourceBehaviour(element, element.getVirtualFile(), createPane());
+ }
+
+ public void testShowClassMembers() throws IncorrectOperationException, IOException {
+ myShowMembers = true;
+ useStandardProviders();
+ PsiClass aClass = JavaDirectoryService.getInstance().getClasses(getPackageDirectory())[1];
+ PsiClass innerClass1 = aClass.getInnerClasses()[0];
+ PsiClass innerClass12 = innerClass1.getInnerClasses()[0];
+ PsiClass innerClass13 = innerClass12.getInnerClasses()[0];
+ PsiClass innerClass14 = innerClass13.getInnerClasses()[0];
+ PsiClass innerClass15 = innerClass14.getInnerClasses()[0];
+
+ PsiClass innerClass2 = aClass.getInnerClasses()[1];
+ PsiClass innerClass21 = innerClass2.getInnerClasses()[0];
+ PsiClass innerClass23 = innerClass21.getInnerClasses()[0];
+ PsiClass innerClass24 = innerClass23.getInnerClasses()[0];
+
+ PsiField innerClass1Field = innerClass14.getFields()[0];
+ PsiField innerClass2Field = innerClass24.getFields()[0];
+
+ final AbstractProjectViewPSIPane pane = createPane();
+
+ checkNavigateFromSourceBehaviour(innerClass2Field, innerClass2Field.getContainingFile().getVirtualFile(), pane);
+
+ IdeaTestUtil.assertTreeEqual(pane.getTree(), "-Project\n" +
+ " -PsiDirectory: showClassMembers\n" +
+ " -PsiDirectory: src\n" +
+ " -PsiDirectory: com\n" +
+ " -PsiDirectory: package1\n" +
+ " +Class1\n" +
+ " -Class2\n" +
+ " +InnerClass1\n" +
+ " -InnerClass2\n" +
+ " -InnerClass22\n" +
+ " -InnerClass23\n" +
+ " -InnerClass24\n" +
+ " +InnerClass25\n" +
+ " myFieldToSelect:int\n" +
+ " myInnerClassField:int\n" +
+ " myInnerClassField:int\n" +
+ " myInnerClassField:int\n" +
+ " getValue():int\n" +
+ " myField1:boolean\n" +
+ " myField2:boolean\n" +
+ " myField3:boolean\n" +
+ " myField4:boolean\n" +
+ getRootFiles() +
+ " +External Libraries\n"
+ );
+
+ assertFalse(isExpanded(innerClass15.getFields()[0], pane));
+ assertFalse(isExpanded(innerClass1Field, pane));
+ assertTrue(isExpanded(innerClass2Field, pane));
+
+ VirtualFile virtualFile = aClass.getContainingFile().getVirtualFile();
+ FileEditorManager fileEditorManager = FileEditorManager.getInstance(myProject);
+ FileEditor[] fileEditors = fileEditorManager.openFile(virtualFile, false);
+ StructureViewComponent structureViewComponent2 = null;
+ StructureViewComponent structureViewComponent = null;
+
+ try {
+ structureViewComponent = (StructureViewComponent)fileEditors[0].getStructureViewBuilder().createStructureView(fileEditors[0], myProject);
+ structureViewComponent.setActionActive(InheritedMembersFilter.ID, true);
+
+ TreeUtil.collapseAll(structureViewComponent.getTree(), -1);
+
+ structureViewComponent.select(innerClass2Field, true);
+
+ String expected = "-Class2.java\n" +
+ " -Class2\n" +
+ " +InnerClass1\n" +
+ " -InnerClass2\n" +
+ " -InnerClass22\n" +
+ " -InnerClass23\n" +
+ " -InnerClass24\n" +
+ " +InnerClass25\n" +
+ " myFieldToSelect:int\n" +
+ " myInnerClassField:int\n" +
+ " myInnerClassField:int\n" +
+ " myInnerClassField:int\n" +
+ " getValue():int\n" +
+ " myField1:boolean\n" +
+ " myField2:boolean\n" +
+ " myField3:boolean\n" +
+ " myField4:boolean\n";
+
+ IdeaTestUtil.assertTreeEqual(structureViewComponent.getTree(),
+ expected);
+
+
+ Disposer.dispose(structureViewComponent);
+
+ final FileEditor fileEditor = fileEditors[0];
+ structureViewComponent2 = (StructureViewComponent)fileEditor.getStructureViewBuilder().createStructureView(fileEditor, myProject);
+ structureViewComponent2.setActionActive(InheritedMembersFilter.ID, true);
+ IdeaTestUtil.assertTreeEqual(structureViewComponent2.getTree(), expected);
+ }
+ finally {
+ fileEditorManager.closeFile(virtualFile);
+ if (structureViewComponent2 != null) {
+ Disposer.dispose(structureViewComponent2);
+ }
+ }
+ }
+}
--- /dev/null
+package com.intellij.projectView;
+
+public class ProjectTreeStructureTest extends BaseProjectViewTestCase {
+
+ public void test1() {
+ getProjectTreeStructure().setProviders(new SameNamesJoiner(), new ClassNameConvertor(myProject));
+ assertStructureEqual(getPackageDirectory(), "PsiDirectory: package1\n" +
+ " Class2.java converted\n" +
+ " Form1 joined\n" +
+ " Form1.java converted\n" +
+ " PsiFile(plain text):Form1.form\n" +
+ " PsiFile(plain text):Form2.form\n");
+ }
+
+ public void testStandardProviders() {
+ useStandardProviders();
+
+ assertStructureEqual(getPackageDirectory(), "PsiDirectory: package1\n" +
+ " PsiClass:Class1\n" +
+ " PsiClass:Form1\n" +
+ " PsiFile(plain text):Form1.form\n" +
+ " PsiFile(plain text):Form2.form\n" +
+ " PsiJavaFile:Class2.java\n" +
+ " PsiClass:Class2\n" +
+ " PsiClass:Class3\n" +
+ " PsiJavaFile:Class4.java\n");
+ assertStructureEqual("Project\n" +
+ " External Libraries\n" +
+ " Library: < java 1.4 >\n" +
+ " PsiDirectory: jsp-api.jar\n" +
+ " PsiDirectory: META-INF\n" +
+ " PsiFile(plain text):MANIFEST.MF\n" +
+ " PsiDirectory: javax\n" +
+ " PsiDirectory: servlet\n" +
+ " PsiDirectory: jsp\n" +
+ " PsiClass:ErrorData\n" +
+ " PsiClass:HttpJspPage\n" +
+ " PsiClass:JspContext\n" +
+ " PsiClass:JspEngineInfo\n" +
+ " PsiClass:JspException\n" +
+ " PsiClass:JspFactory\n" +
+ " PsiClass:JspPage\n" +
+ " PsiClass:JspTagException\n"
+ );
+
+ getProjectTreeStructure().setProviders();
+
+ assertStructureEqual(getPackageDirectory(), "PsiDirectory: package1\n" +
+ " PsiFile(plain text):Form1.form\n" +
+ " PsiFile(plain text):Form2.form\n" +
+ " PsiJavaFile:Class1.java\n" +
+ " PsiJavaFile:Class2.java\n" +
+ " PsiJavaFile:Class4.java\n" +
+ " PsiJavaFile:Form1.java\n");
+
+ assertStructureEqual("Project\n" +
+ " External Libraries\n" +
+ " Library: < java 1.4 >\n" +
+ " PsiDirectory: jsp-api.jar\n" +
+ " PsiDirectory: META-INF\n" +
+ " PsiFile(plain text):MANIFEST.MF\n" +
+ " PsiDirectory: javax\n" +
+ " PsiDirectory: servlet\n" +
+ " PsiDirectory: jsp\n" +
+ " PsiDirectory: el\n" +
+ " PsiFile:ELException.class\n" +
+ " PsiFile:ELParseException.class\n" +
+ " PsiFile:Expression.class\n" +
+ " PsiFile:ExpressionEvaluator.class\n" +
+ " PsiFile:FunctionMapper.class\n" +
+ " PsiFile:VariableResolver.class\n" +
+ " PsiDirectory: resources\n");
+ }
+
+ public void testShowClassMembers() {
+ useStandardProviders();
+
+ myShowMembers = false;
+ assertStructureEqual(getPackageDirectory(), "PsiDirectory: package1\n" +
+ " PsiClass:Class1\n" +
+ " PsiClass:Class2\n");
+
+ myShowMembers = true;
+ assertStructureEqual(getPackageDirectory(), "PsiDirectory: package1\n" +
+ " PsiClass:Class1\n" +
+ " PsiClass:InnerClass\n" +
+ " PsiField:myInnerClassField\n" +
+ " PsiField:myField1\n" +
+ " PsiField:myField2\n" +
+ " PsiMethod:getValue\n" +
+ " PsiClass:Class2\n" +
+ " PsiClass:InnerClass1\n" +
+ " PsiClass:InnerClass12\n" +
+ " PsiClass:InnerClass13\n" +
+ " PsiClass:InnerClass14\n" +
+ " PsiClass:InnerClass15\n" +
+ " PsiField:myInnerClassField\n" +
+ " PsiField:myInnerClassField\n" +
+ " PsiField:myInnerClassField\n" +
+ " PsiField:myInnerClassField\n" +
+ " PsiField:myInnerClassField\n" +
+ " PsiClass:InnerClass2\n" +
+ " PsiClass:InnerClass22\n" +
+ " PsiClass:InnerClass23\n" +
+ " PsiClass:InnerClass24\n" +
+ " PsiClass:InnerClass25\n" +
+ " PsiField:myInnerClassField\n" +
+ " PsiField:myFieldToSelect\n" +
+ " PsiField:myInnerClassField\n" +
+ " PsiField:myInnerClassField\n" +
+ " PsiField:myInnerClassField\n" +
+ " PsiField:myField1\n" +
+ " PsiField:myField2\n" +
+ " PsiField:myField3\n" +
+ " PsiField:myField4\n" +
+ " PsiMethod:getValue\n", 100);
+
+
+ }
+
+
+ public void testGetParentObject(){
+ useStandardProviders();
+ myShowMembers = true;
+ assertStructureEqual(getContentDirectory(), "PsiDirectory: getParentObject\n" +
+ " PsiDirectory: src\n" +
+ " PsiDirectory: com\n" +
+ " PsiDirectory: package1\n" +
+ " PsiClass:Class1\n" +
+ " PsiField:myField\n" +
+ " PsiMethod:method\n" +
+ " PsiClass:Form1\n" +
+ " PsiFile(plain text):Form1.form\n" +
+ " PsiFile(plain text):Form2.form\n" +
+ " PsiJavaFile:Class2.java\n" +
+ " PsiClass:Class2\n" +
+ " PsiClass:Class3\n" +
+ " PsiJavaFile:Class4.java\n");
+
+
+ checkContainsMethod(myStructure.getRootElement(), myStructure);
+
+ }
+
+}
--- /dev/null
+package com.intellij.projectView;
+
+import com.intellij.ide.favoritesTreeView.FavoritesManager;
+import com.intellij.ide.favoritesTreeView.FavoritesProjectViewPane;
+import com.intellij.ide.projectView.ProjectView;
+import com.intellij.ide.projectView.impl.AbstractProjectViewPane;
+import com.intellij.ide.projectView.impl.ProjectViewImpl;
+import com.intellij.ide.projectView.impl.ProjectViewPane;
+import com.intellij.testFramework.TestSourceBasedTestCase;
+
+public class ProjectViewSwitchingTest extends TestSourceBasedTestCase {
+ protected String getTestPath() {
+ return "projectView";
+ }
+
+ protected void setUp() throws Exception {
+ super.setUp();
+ ((ProjectViewImpl)ProjectView.getInstance(getProject())).setupImpl(null);
+ }
+
+ @Override
+ protected void runStartupActivities() {
+ FavoritesManager.getInstance(getProject()).projectOpened();
+ super.runStartupActivities();
+ }
+
+ protected void tearDown() throws Exception {
+ FavoritesManager.getInstance(getProject()).projectClosed();
+
+ super.tearDown();
+ }
+
+ public void testSelectProject() {
+ ProjectView projectView = ProjectView.getInstance(getProject());
+ projectView.changeView(ProjectViewPane.ID);
+
+ assertEquals(ProjectViewPane.ID, projectView.getCurrentViewId());
+
+ FavoritesManager favoritesManager = FavoritesManager.getInstance(getProject());
+ favoritesManager.createNewList("xxxx");
+
+ AbstractProjectViewPane currentPane = projectView.getCurrentProjectViewPane();
+ assertEquals(FavoritesProjectViewPane.ID, currentPane.getId());
+ assertEquals("xxxx", currentPane.getSubId());
+
+ favoritesManager.createNewList("yyyy");
+ currentPane = projectView.getCurrentProjectViewPane();
+ assertEquals(FavoritesProjectViewPane.ID, currentPane.getId());
+ assertEquals("yyyy", currentPane.getSubId());
+
+ favoritesManager.removeFavoritesList("xxxx");
+ currentPane = projectView.getCurrentProjectViewPane();
+ assertEquals(FavoritesProjectViewPane.ID, currentPane.getId());
+ assertEquals("yyyy", currentPane.getSubId());
+ }
+}
--- /dev/null
+package com.intellij.projectView;
+
+import com.intellij.ide.projectView.PresentationData;
+import com.intellij.ide.projectView.ProjectViewNode;
+import com.intellij.ide.projectView.TreeStructureProvider;
+import com.intellij.ide.projectView.ViewSettings;
+import com.intellij.ide.util.treeView.AbstractTreeNode;
+import com.intellij.openapi.util.MultiValuesMap;
+import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.psi.PsiDirectory;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiFile;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+
+class SameNamesJoiner implements TreeStructureProvider {
+ public Collection<AbstractTreeNode> modify(AbstractTreeNode parent, Collection<AbstractTreeNode> children, ViewSettings settings) {
+ if (parent instanceof JoinedNode) return children;
+
+ ArrayList<AbstractTreeNode> result = new ArrayList<AbstractTreeNode>();
+
+ MultiValuesMap<Object, AbstractTreeNode> executed = new MultiValuesMap<Object, AbstractTreeNode>();
+ for (Iterator<AbstractTreeNode> iterator = children.iterator(); iterator.hasNext();) {
+ ProjectViewNode treeNode = (ProjectViewNode)iterator.next();
+ Object o = treeNode.getValue();
+ if (o instanceof PsiFile) {
+ String name = ((PsiFile)o).getVirtualFile().getNameWithoutExtension();
+ executed.put(name, treeNode);
+ }
+ else {
+ executed.put(o, treeNode);
+ }
+ }
+
+ Iterator<Object> keys = executed.keySet().iterator();
+ while (keys.hasNext()) {
+ Object each = keys.next();
+ Collection<AbstractTreeNode> objects = executed.get(each);
+ if (objects.size() > 1) {
+ result.add(new JoinedNode(objects, new Joined(findPsiFileIn(objects))));
+ }
+ else if (objects.size() == 1) {
+ result.add(objects.iterator().next());
+ }
+ }
+
+ return result;
+ }
+
+ public Object getData(Collection<AbstractTreeNode> selected, String dataName) {
+ return null;
+ }
+
+ public PsiElement getTopLevelElement(final PsiElement element) {
+ return null;
+ }
+
+ private PsiFile findPsiFileIn(Collection<AbstractTreeNode> objects) {
+ for (Iterator<AbstractTreeNode> iterator = objects.iterator(); iterator.hasNext();) {
+ AbstractTreeNode treeNode = iterator.next();
+ if (treeNode.getValue() instanceof PsiFile) return (PsiFile)treeNode.getValue();
+ }
+ return null;
+ }
+
+ private boolean hasElementWithTheSameName(PsiFile element) {
+ PsiDirectory psiDirectory = ((PsiDirectory)element.getParent());
+ PsiElement[] children = psiDirectory.getChildren();
+ for (int i = 0; i < children.length; i++) {
+ PsiElement child = children[i];
+
+ if (child != element && element.getVirtualFile().getNameWithoutExtension().equals(((PsiFile)child).getVirtualFile().getNameWithoutExtension())){
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ private class Joined{
+ private final String myName;
+ private final PsiFile myFile;
+
+ public Joined(PsiFile file) {
+ myFile = file;
+ myName = file.getName();
+ }
+
+ public String toString() {
+ return myFile.getVirtualFile().getNameWithoutExtension();
+ }
+
+ public PsiFile getPsiFile() {
+ return myFile;
+ }
+
+ public boolean equals(Object object) {
+ if (!(object instanceof Joined)) return false;
+ return myFile.getVirtualFile().getNameWithoutExtension()
+ .equals(((Joined)object).myFile.getVirtualFile().getNameWithoutExtension());
+ }
+ }
+
+ private class JoinedNode extends ProjectViewNode<Joined>{
+ Collection<AbstractTreeNode> myChildren;
+
+ @NotNull
+ public Collection<AbstractTreeNode> getChildren() {
+ return myChildren;
+ }
+
+ public JoinedNode(Collection<AbstractTreeNode> children, Joined formFile) {
+ super(null, formFile, null);
+ myChildren = children;
+ }
+
+ public String getTestPresentation() {
+ return getValue().toString() + " joined";
+ }
+
+ public boolean contains(@NotNull VirtualFile file) {
+ return false;
+ }
+
+ public void update(PresentationData presentation) {
+ }
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2004 JetBrains s.r.o. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * -Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * -Redistribution in binary form must reproduct the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the distribution.
+ *
+ * Neither the name of JetBrains or IntelliJ IDEA
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
+ * ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+ * OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. JETBRAINS AND ITS LICENSORS SHALL NOT
+ * BE LIABLE FOR ANY DAMAGES OR LIABILITIES SUFFERED BY LICENSEE AS A RESULT
+ * OF OR RELATING TO USE, MODIFICATION OR DISTRIBUTION OF THE SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL JETBRAINS OR ITS LICENSORS BE LIABLE FOR ANY LOST
+ * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
+ * INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY
+ * OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE SOFTWARE, EVEN
+ * IF JETBRAINS HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ */
+package com.intellij.projectView;
+
+import com.intellij.ide.structureView.impl.java.InheritedMembersFilter;
+import com.intellij.ide.structureView.newStructureView.StructureViewComponent;
+import com.intellij.testFramework.IdeaTestUtil;
+import com.intellij.openapi.application.ApplicationManager;
+import com.intellij.openapi.command.CommandProcessor;
+import com.intellij.openapi.editor.Document;
+import com.intellij.openapi.fileEditor.FileEditor;
+import com.intellij.openapi.fileEditor.FileEditorManager;
+import com.intellij.openapi.util.Disposer;
+import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.psi.JavaDirectoryService;
+import com.intellij.psi.PsiClass;
+import com.intellij.psi.PsiDocumentManager;
+import com.intellij.psi.PsiField;
+import com.intellij.testFramework.TestSourceBasedTestCase;
+import com.intellij.util.IncorrectOperationException;
+
+import javax.swing.*;
+
+public class StructureViewUpdatingTest extends TestSourceBasedTestCase {
+ protected String getTestPath() {
+ return "structureView";
+ }
+
+ public void testJavaClassStructure() throws Exception {
+ final PsiClass psiClass = JavaDirectoryService.getInstance().getClasses(getPackageDirectory("com/package1"))[0];
+ final VirtualFile virtualFile = psiClass.getContainingFile().getVirtualFile();
+ final FileEditorManager fileEditorManager = FileEditorManager.getInstance(myProject);
+ FileEditor[] fileEditors = fileEditorManager.openFile(virtualFile, false);
+ final FileEditor fileEditor = fileEditors[0];
+ try {
+ final StructureViewComponent structureViewComponent =
+ (StructureViewComponent)fileEditor.getStructureViewBuilder().createStructureView(fileEditor, myProject);
+ final Document document = PsiDocumentManager.getInstance(myProject).getDocument(psiClass.getContainingFile());
+ IdeaTestUtil.assertTreeEqual(structureViewComponent.getTree(), "-Class1.java\n" + " -Class1\n" + " getValue():int\n" +
+ " hashCode():int\n" + " finalize():void\n" + " notify():void\n" +
+ " notifyAll():void\n" + " wait():void\n" + " wait(long):void\n" +
+ " wait(long, int):void\n" + " getClass():Class\n" +
+ " clone():Object\n" + " equals(Object):boolean\n" +
+ " toString():String\n" + " myField1:boolean\n" +
+ " myField2:boolean\n");
+
+ CommandProcessor.getInstance().executeCommand(myProject, new Runnable() {
+ public void run() {
+
+ final int offset = document.getLineStartOffset(5);
+ document.insertString(offset, " boolean myNewField = false;\n");
+ }
+ }, null, null);
+
+ PsiDocumentManager.getInstance(myProject).commitDocument(document);
+
+ IdeaTestUtil.waitForAlarm(600);
+
+ //TreeUtil.expand(structureViewComponent.getTree(), 3);
+
+ IdeaTestUtil.assertTreeEqual(structureViewComponent.getTree(), "-Class1.java\n" +
+ " -Class1\n" + " getValue():int\n" +
+ " hashCode():int\n" +
+ " finalize():void\n" +
+ " notify():void\n" +
+ " notifyAll():void\n" +
+ " wait():void\n" +
+ " wait(long):void\n" +
+ " wait(long, int):void\n" +
+ " getClass():Class\n" +
+ " clone():Object\n" +
+ " equals(Object):boolean\n" +
+ " toString():String\n" +
+ " myField1:boolean\n" +
+ " myField2:boolean\n" +
+ " myNewField:boolean = false\n");
+
+ Disposer.dispose(structureViewComponent);
+
+ }
+ finally {
+ fileEditorManager.closeFile(virtualFile);
+ }
+ }
+
+ public void testShowClassMembers() throws Exception {
+ final PsiClass psiClass = JavaDirectoryService.getInstance().getClasses(getPackageDirectory("com/package1"))[0];
+ final VirtualFile virtualFile = psiClass.getContainingFile().getVirtualFile();
+ final FileEditorManager fileEditorManager = FileEditorManager.getInstance(myProject);
+ FileEditor[] fileEditors = fileEditorManager.openFile(virtualFile, false);
+ final FileEditor fileEditor = fileEditors[0];
+ final StructureViewComponent structureViewComponent =
+ (StructureViewComponent)fileEditor.getStructureViewBuilder().createStructureView(fileEditor, myProject);
+ try {
+ structureViewComponent.setActionActive(InheritedMembersFilter.ID, true);
+
+ IdeaTestUtil.assertTreeEqual(structureViewComponent.getTree(), "-Class2.java\n" +
+ " -Class2\n" +
+ " +InnerClass1\n" +
+ " +InnerClass2\n" +
+ " getValue():int\n" +
+ " myField1:boolean\n" +
+ " myField2:boolean\n" +
+ " myField3:boolean\n" +
+ " myField4:boolean\n");
+
+ final PsiField innerClassField = psiClass.getInnerClasses()[0].getFields()[0];
+
+ structureViewComponent.select(innerClassField, true);
+
+ IdeaTestUtil.assertTreeEqual(structureViewComponent.getTree(), "-Class2.java\n" +
+ " -Class2\n" +
+ " -InnerClass1\n" +
+ " +InnerClass12\n" +
+ " myInnerClassField:int\n" +
+ " +InnerClass2\n" +
+ " getValue():int\n" +
+ " myField1:boolean\n" +
+ " myField2:boolean\n" +
+ " myField3:boolean\n" +
+ " myField4:boolean\n");
+
+ CommandProcessor.getInstance().executeCommand(myProject, new Runnable() {
+ public void run() {
+
+ ApplicationManager.getApplication().runWriteAction(new Runnable() {
+ public void run() {
+ try {
+ innerClassField.delete();
+ }
+ catch (IncorrectOperationException e) {
+ assertTrue(e.getLocalizedMessage(), false);
+ }
+ }
+ });
+ }
+ }, null, null);
+
+ IdeaTestUtil.waitForAlarm(600);
+
+ IdeaTestUtil.assertTreeEqual(structureViewComponent.getTree(), "-Class2.java\n" +
+ " -Class2\n" +
+ " -InnerClass1\n" +
+ " +InnerClass12\n" +
+ " +InnerClass2\n" +
+ " getValue():int\n" +
+ " myField1:boolean\n" +
+ " myField2:boolean\n" +
+ " myField3:boolean\n" +
+ " myField4:boolean\n");
+
+ }
+ finally {
+ Disposer.dispose(structureViewComponent);
+ fileEditorManager.closeFile(virtualFile);
+ }
+ }
+
+ public void testExpandElementWithExitingName() throws InterruptedException {
+
+ final VirtualFile xmlVirtualFile = getContentRoot().findFileByRelativePath("test.xml");
+ final FileEditorManager fileEditorManager = FileEditorManager.getInstance(myProject);
+ FileEditor[] fileEditors = fileEditorManager.openFile(xmlVirtualFile, false);
+ final FileEditor fileEditor = fileEditors[0];
+ try {
+ final StructureViewComponent structureViewComponent =
+ (StructureViewComponent)fileEditor.getStructureViewBuilder().createStructureView(fileEditor, myProject);
+
+ final JTree tree = structureViewComponent.getTree();
+ IdeaTestUtil.assertTreeEqual(tree, "-test.xml\n" +
+ " -test\n" +
+ " +level1\n" +
+ " +level1\n" +
+ " +level1\n" +
+ " +level1\n");
+
+ tree.expandPath(tree.getPathForRow(3));
+
+ IdeaTestUtil.waitForAlarm(600);
+
+
+ IdeaTestUtil.assertTreeEqual(tree,
+ "-test.xml\n" +
+ " -test\n" +
+ " +level1\n" +
+ " -level1\n" +
+ " +level2\n" +
+ " +level1\n" +
+ " +level1\n");
+
+ Disposer.dispose(structureViewComponent);
+ }
+ finally {
+ fileEditorManager.closeFile(xmlVirtualFile);
+ }
+
+ }
+}
--- /dev/null
+package com.intellij.projectView;
+
+import com.intellij.ide.todo.AllTodosTreeBuilder;
+import com.intellij.ide.todo.CurrentFileTodosTreeBuilder;
+import com.intellij.ide.todo.TodoTreeStructure;
+import com.intellij.ide.todo.nodes.TodoItemNode;
+import com.intellij.testFramework.IdeaTestUtil;
+import com.intellij.openapi.util.Disposer;
+import com.intellij.util.ui.tree.TreeUtil;
+
+import javax.swing.*;
+import javax.swing.tree.DefaultMutableTreeNode;
+import javax.swing.tree.DefaultTreeModel;
+
+public class ToDoTreeStructureTest extends BaseProjectViewTestCase {
+
+ public void testToDo1() throws Exception {
+ AllTodosTreeBuilder all = new AllTodosTreeBuilder(new JTree(), new DefaultTreeModel(new DefaultMutableTreeNode()), myProject);
+ all.init();
+
+ myStructure = all.getTreeStructure();
+ ((TodoTreeStructure)myStructure).setFlattenPackages(true);
+ assertStructureEqual("Root\n" +
+ " Summary\n" +
+ " PsiPackage: package1.package2 (2 items in 1 file)\n" +
+ " PsiJavaFile:JavaClass.java\n" +
+ " Item: (62,78)\n" +
+ " Item: (145,162)\n", null);
+
+ checkOccurances(all, new String[]{"Item: (62,78)", "Item: (145,162)"});
+ Disposer.dispose(all);
+ }
+
+ //todo kirillk
+ public void _testToDo() throws Exception {
+ AllTodosTreeBuilder all = new AllTodosTreeBuilder(new JTree(), new DefaultTreeModel(new DefaultMutableTreeNode()), myProject);
+ all.init();
+
+ myStructure = all.getTreeStructure();
+ assertStructureEqual("Root\n" +
+ " Summary\n" +
+ " PsiDirectory: toDo\n" +
+ " XmlFile:xmlFile.xml\n"+
+ " Item: (12,16)\n" +
+ " PsiPackage: package1 (4 items in 2 files)\n" +
+ " PsiPackage: package2 (2 items in 1 file)\n" +
+ " PsiJavaFile:JavaClass.java\n" +
+ " Item: (62,78)\n" +
+ " Item: (145,162)\n" +
+ " PsiJavaFile:JavaClass.java\n" +
+ " Item: (52,68)\n" +
+ " Item: (134,151)\n" +
+ " PsiPackage: package3 (2 items in 1 file)\n" +
+ " PsiJavaFile:JavaClass.java\n" +
+ " Item: (53,69)\n" +
+ " Item: (136,153)\n", null);
+
+ checkOccurances(all, new String[]{"Item: (12,16)","Item: (62,78)", "Item: (145,162)", "Item: (52,68)", "Item: (134,151)",
+ "Item: (53,69)", "Item: (136,153)"});
+
+
+ final DefaultTreeModel treeModel = new DefaultTreeModel(new DefaultMutableTreeNode());
+ final JTree currentFileTree = new JTree(treeModel);
+ CurrentFileTodosTreeBuilder builder = new CurrentFileTodosTreeBuilder(currentFileTree,
+ treeModel,
+ myProject);
+
+ builder.init();
+ builder.setFile(getSrcDirectory().findSubdirectory("package1").findFile("JavaClass.java"));
+ builder.updateFromRoot();
+ myStructure = builder.getTreeStructure();
+ assertStructureEqual("PsiJavaFile:JavaClass.java\n" +
+ " PsiJavaFile:JavaClass.java\n" +
+ " Item: (52,68)\n" +
+ " Item: (134,151)\n", null);
+
+ TreeUtil.expandAll(currentFileTree);
+
+ currentFileTree.getSelectionModel().setSelectionPath(currentFileTree.getPathForRow(4));
+
+ IdeaTestUtil.assertTreeEqual(currentFileTree, "-Root\n" +
+ " -Summary\n" +
+ " -JavaClass.java\n" +
+ " Item: (52,68)\n" +
+ " [Item: (134,151)]\n", true);
+
+ IdeaTestUtil.waitForAlarm(600);
+
+ IdeaTestUtil.assertTreeEqual(currentFileTree, "-Root\n" +
+ " -Summary\n" +
+ " -JavaClass.java\n" +
+ " Item: (52,68)\n" +
+ " [Item: (134,151)]\n", true);
+ Disposer.dispose(builder);
+ Disposer.dispose(all);
+ }
+
+ private void checkOccurances(final AllTodosTreeBuilder all, final String[] strings) {
+ TodoItemNode current = all.getFirstPointerForElement(myStructure.getRootElement());
+ for (int i = 0; i < strings.length; i++) {
+ String string = strings[i];
+ assertNotNull(current);
+ assertEquals(string, current.getTestPresentation());
+ current = all.getNextPointer(current);
+ }
+
+ assertNull(current);
+
+ current = all.getLastPointerForElement(myStructure.getRootElement());
+ for (int i = strings.length - 1; i >= 0; i--) {
+ String string = strings[i];
+ assertNotNull(current);
+ assertEquals(string, current.getTestPresentation());
+ current = all.getPreviousPointer(current);
+ }
+ assertNull(current);
+ }
+
+}