diff --git a/java/java-tests/testData/fileStructure/selection/Anonymous.java b/java/java-tests/testData/fileStructure/selection/Anonymous.java new file mode 100644 index 000000000000..7504bf0c973b --- /dev/null +++ b/java/java-tests/testData/fileStructure/selection/Anonymous.java @@ -0,0 +1,8 @@ +class Anonymous { + int num1; + int num2; + Object o = new Object(){}; + + Anonymous() {} + void foo() {} +} \ No newline at end of file diff --git a/java/java-tests/testData/fileStructure/selection/Anonymous.tree b/java/java-tests/testData/fileStructure/selection/Anonymous.tree new file mode 100644 index 000000000000..94920b4c0554 --- /dev/null +++ b/java/java-tests/testData/fileStructure/selection/Anonymous.tree @@ -0,0 +1,8 @@ +-Anonymous.java + -Anonymous + Anonymous() + foo():void + num1:int + num2:int + -[o:Object = new Object() {...}] + $1 \ No newline at end of file diff --git a/java/java-tests/testData/fileStructure/selection/AnonymousInAnonymous.java b/java/java-tests/testData/fileStructure/selection/AnonymousInAnonymous.java new file mode 100644 index 000000000000..5bfeff7b4eda --- /dev/null +++ b/java/java-tests/testData/fileStructure/selection/AnonymousInAnonymous.java @@ -0,0 +1,15 @@ +class AnonymousInAnonymous { + int num1; + int num2; + + AnonymousInAnonymous() {} + void foo() { + new Object() { + public String toString() { + return new Object(){ + void method() {} + }.toString(); + } + }; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/fileStructure/selection/AnonymousInAnonymous.tree b/java/java-tests/testData/fileStructure/selection/AnonymousInAnonymous.tree new file mode 100644 index 000000000000..1f8848854d70 --- /dev/null +++ b/java/java-tests/testData/fileStructure/selection/AnonymousInAnonymous.tree @@ -0,0 +1,10 @@ +-AnonymousInAnonymous.java + -AnonymousInAnonymous + AnonymousInAnonymous() + -foo():void + -$1 + -toString():String + -Anonymous + [method():void] + num1:int + num2:int \ No newline at end of file diff --git a/java/java-tests/testSrc/Anonymous.java b/java/java-tests/testSrc/Anonymous.java new file mode 100644 index 000000000000..e72d2fb65789 --- /dev/null +++ b/java/java-tests/testSrc/Anonymous.java @@ -0,0 +1,10 @@ +class Anonymous { + int num1; + int num2; + Object o = new Object(){ + int num = 1; + }; + + Anonymous() {} + void foo() {} +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/ide/fileStructure/JavaFileStructureSelectionTest.java b/java/java-tests/testSrc/com/intellij/ide/fileStructure/JavaFileStructureSelectionTest.java index 84e971463a84..fbea9c3943bf 100644 --- a/java/java-tests/testSrc/com/intellij/ide/fileStructure/JavaFileStructureSelectionTest.java +++ b/java/java-tests/testSrc/com/intellij/ide/fileStructure/JavaFileStructureSelectionTest.java @@ -24,8 +24,10 @@ public class JavaFileStructureSelectionTest extends JavaFileStructureTestCase { return "selection"; } - public void testField() throws Exception {checkTree();} - public void testMethod() throws Exception {checkTree();} - public void testConstructor() throws Exception {checkTree();} - public void testInsideClass() throws Exception {checkTree();} + public void testField() throws Exception {checkTree();} + public void testMethod() throws Exception {checkTree();} + public void testConstructor() throws Exception {checkTree();} + public void testInsideClass() throws Exception {checkTree();} + public void testAnonymous() throws Exception {checkTree();} + public void testAnonymousInAnonymous() throws Exception {checkTree();} } diff --git a/java/java-tests/testSrc/com/intellij/ide/fileStructure/JavaFileStructureTestCase.java b/java/java-tests/testSrc/com/intellij/ide/fileStructure/JavaFileStructureTestCase.java index 0753206117da..c3559b0370f3 100644 --- a/java/java-tests/testSrc/com/intellij/ide/fileStructure/JavaFileStructureTestCase.java +++ b/java/java-tests/testSrc/com/intellij/ide/fileStructure/JavaFileStructureTestCase.java @@ -33,6 +33,9 @@ public abstract class JavaFileStructureTestCase extends FileStructureTestBase { public void setUp() throws Exception { super.setUp(); myShowAnonymousByDefault = PropertiesComponent.getInstance().getBoolean(getAnonymousPropertyName(), false); + if (getTestName(false).contains("Anonymous")) { + setShowAnonymous(true); + } } @Override @@ -40,6 +43,11 @@ public abstract class JavaFileStructureTestCase extends FileStructureTestBase { return "java"; } + public void setShowAnonymous(boolean show) throws Exception { + myPopup.setTreeActionState(JavaAnonymousClassesNodeProvider.class, show); + update(); + } + @Override public void tearDown() throws Exception { PropertiesComponent.getInstance().setValue(getAnonymousPropertyName(), Boolean.toString(myShowAnonymousByDefault)); diff --git a/platform/lang-impl/src/com/intellij/ide/util/FileStructurePopup.java b/platform/lang-impl/src/com/intellij/ide/util/FileStructurePopup.java index 39dbe47a25aa..bc270a07174d 100644 --- a/platform/lang-impl/src/com/intellij/ide/util/FileStructurePopup.java +++ b/platform/lang-impl/src/com/intellij/ide/util/FileStructurePopup.java @@ -107,6 +107,7 @@ public class FileStructurePopup implements Disposable { private int myPreferredWidth; private final FilteringTreeStructure myFilteringStructure; private PsiElement myInitialPsiElement; + private Map myCheckBoxes = new HashMap(); public FileStructurePopup(StructureViewModel structureViewModel, @Nullable Editor editor, @@ -128,7 +129,7 @@ public class FileStructurePopup implements Disposable { myTreeStructure = new SmartTreeStructure(project, myTreeModel){ public void rebuildTree() { - if (!myPopup.isDisposed()) { + if (ApplicationManager.getApplication().isUnitTestMode() || !myPopup.isDisposed()) { super.rebuildTree(); } } @@ -503,7 +504,7 @@ public class FileStructurePopup implements Disposable { return null; } - protected JComponent createCenterPanel() { + public JComponent createCenterPanel() { List fileStructureFilters = new ArrayList(); List fileStructureNodeProviders = new ArrayList(); if (myTreeActionsOwner != null) { @@ -704,6 +705,7 @@ public class FileStructurePopup implements Disposable { } chkFilter.setText(text); panel.add(chkFilter); + myCheckBoxes.put(action.getClass(), chkFilter); } private static boolean getDefaultValue(TreeAction action) { @@ -742,6 +744,16 @@ public class FileStructurePopup implements Disposable { return myAbstractTreeBuilder; } + public void setTreeActionState(Class action, boolean state) { + final JCheckBox checkBox = myCheckBoxes.get(action); + if (checkBox != null) { + checkBox.setSelected(state); + for (ActionListener listener : checkBox.getActionListeners()) { + listener.actionPerformed(new ActionEvent(this, 1, "")); + } + } + } + private class FileStructurePopupFilter implements ElementFilter { private String myLastFilter = null; private HashSet myVisibleParents = new HashSet(); diff --git a/platform/testFramework/src/com/intellij/testFramework/FileStructureTestBase.java b/platform/testFramework/src/com/intellij/testFramework/FileStructureTestBase.java index 645d6ae0192e..99c205834e94 100644 --- a/platform/testFramework/src/com/intellij/testFramework/FileStructureTestBase.java +++ b/platform/testFramework/src/com/intellij/testFramework/FileStructureTestBase.java @@ -36,7 +36,7 @@ import java.io.File; * @author Konstantin Bulenkov */ public abstract class FileStructureTestBase extends CodeInsightFixtureTestCase { - FileStructurePopup myPopup; + protected FileStructurePopup myPopup; @Before public void setUp() throws Exception { @@ -46,6 +46,9 @@ public abstract class FileStructureTestBase extends CodeInsightFixtureTestCase { myFixture.getProject(), null, TextEditorProvider.getInstance().getTextEditor(myFixture.getEditor())); + assert myPopup != null; + myPopup.createCenterPanel(); + getBuilder().getUi().getUpdater().setPassThroughMode(true); update(); } @@ -71,15 +74,17 @@ public abstract class FileStructureTestBase extends CodeInsightFixtureTestCase { } - private void update() throws InterruptedException { + public void update() throws InterruptedException { myPopup.getTreeBuilder().refilter().doWhenProcessed(new Runnable() { @Override public void run() { + getStructure().rebuild(); updateTree(); + getBuilder().updateFromRoot(); TreeUtil.expandAll(getTree()); final FilteringTreeStructure.FilteringNode node = myPopup.selectPsiElement(myPopup.getCurrentElement(getFile())); - getTree().getSelectionModel().setSelectionPath(getTree().getPath(node)); + getBuilder().getUi().select(node, null); } }); } diff --git a/platform/testFramework/src/com/intellij/testFramework/TestTreeUpdater.java b/platform/testFramework/src/com/intellij/testFramework/TestTreeUpdater.java new file mode 100644 index 000000000000..3dfec720075b --- /dev/null +++ b/platform/testFramework/src/com/intellij/testFramework/TestTreeUpdater.java @@ -0,0 +1,28 @@ +/* + * Copyright 2000-2012 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.util.treeView.AbstractTreeBuilder; +import com.intellij.ide.util.treeView.AbstractTreeUpdater; + +/** + * @author Konstantin Bulenkov + */ +public class TestTreeUpdater extends AbstractTreeUpdater { + public TestTreeUpdater(AbstractTreeBuilder treeBuilder) { + super(treeBuilder); + } +}