diff --git a/source/com/intellij/ide/structureView/impl/common/PsiTreeElementBase.java b/source/com/intellij/ide/structureView/impl/common/PsiTreeElementBase.java index 75728cc672e9..98c50ebd2e48 100644 --- a/source/com/intellij/ide/structureView/impl/common/PsiTreeElementBase.java +++ b/source/com/intellij/ide/structureView/impl/common/PsiTreeElementBase.java @@ -38,6 +38,8 @@ import com.intellij.navigation.ItemPresentation; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Iconable; import com.intellij.psi.PsiElement; +import com.intellij.psi.SmartPointerManager; +import com.intellij.psi.SmartPsiElementPointer; import javax.swing.*; import java.util.ArrayList; @@ -45,12 +47,20 @@ import java.util.Arrays; import java.util.Iterator; import java.util.List; -public abstract class PsiTreeElementBase implements StructureViewTreeElement, ItemPresentation { +public abstract class PsiTreeElementBase implements StructureViewTreeElement, ItemPresentation { + private final SmartPsiElementPointer mySmartPsiElementPointer; + + protected PsiTreeElementBase(PsiElement psiElement) { + mySmartPsiElementPointer = SmartPointerManager.getInstance(psiElement.getProject()).createSmartPsiElementPointer(psiElement); + } + public ItemPresentation getPresentation() { return this; } - public abstract PsiElement getElement(); + public final Value getElement(){ + return (Value)mySmartPsiElementPointer.getElement(); + } public Icon getIcon(boolean open) { final PsiElement element = getElement(); @@ -92,20 +102,4 @@ public abstract class PsiTreeElementBase implements StructureViewTreeElement, It } public abstract StructureViewTreeElement[] getChildrenBase(); - - public int hashCode() { - if (getElement() == null) { - return 0; - } else { - return getElement().hashCode(); - } - } - - public boolean equals(Object object) { - if (object instanceof PsiTreeElementBase) { - return Comparing.equal(getElement(), ((PsiTreeElementBase)object).getElement()); - } else { - return false; - } - } } diff --git a/source/com/intellij/ide/structureView/impl/java/JavaClassTreeElement.java b/source/com/intellij/ide/structureView/impl/java/JavaClassTreeElement.java index acd8f78614c9..d8a982ca2bd1 100644 --- a/source/com/intellij/ide/structureView/impl/java/JavaClassTreeElement.java +++ b/source/com/intellij/ide/structureView/impl/java/JavaClassTreeElement.java @@ -7,12 +7,9 @@ import com.intellij.psi.scope.util.PsiScopesUtil; import java.util.*; -public class JavaClassTreeElement extends JavaClassTreeElementBase { - private final PsiClass myClass; - +public class JavaClassTreeElement extends JavaClassTreeElementBase { public JavaClassTreeElement(PsiClass aClass, boolean inherited) { - super(inherited); - myClass = aClass; + super(inherited,aClass); } public StructureViewTreeElement[] getChildrenBase() { @@ -23,17 +20,17 @@ public class JavaClassTreeElement extends JavaClassTreeElementBase { public Collection getClassChildren() { ArrayList array = new ArrayList(); - List ownChildren = Arrays.asList(myClass.getChildren()); + List ownChildren = Arrays.asList(getElement().getChildren()); ArrayList inherited = new ArrayList(); for (Iterator iterator = ownChildren.iterator(); iterator.hasNext();) { PsiElement psiElement = iterator.next(); if (psiElement.isValid()) inherited.add(psiElement); } - PsiScopesUtil.processScope(myClass, new AddAllMembersProcessor(inherited, myClass, new AddAllMembersProcessor.MemberFilter() { + PsiScopesUtil.processScope(getElement(), new AddAllMembersProcessor(inherited, getElement(), new AddAllMembersProcessor.MemberFilter() { protected boolean isVisible(PsiModifierListOwner member) { return true; } - }), PsiSubstitutor.UNKNOWN, null, myClass); + }), PsiSubstitutor.UNKNOWN, null, getElement()); for (Iterator iterator = inherited.iterator(); iterator.hasNext();) { PsiElement child = (PsiElement)iterator.next(); @@ -61,15 +58,11 @@ public class JavaClassTreeElement extends JavaClassTreeElementBase { } public String getPresentableText() { - return myClass.getName(); - } - - public PsiElement getElement() { - return myClass; + return getElement().getName(); } public boolean isPublic() { - if (myClass.getParent() instanceof PsiFile){ + if (getElement().getParent() instanceof PsiFile){ return true; } else { return super.isPublic(); diff --git a/source/com/intellij/ide/structureView/impl/java/JavaClassTreeElementBase.java b/source/com/intellij/ide/structureView/impl/java/JavaClassTreeElementBase.java index 7f4eec48ab85..ddf89d096d84 100644 --- a/source/com/intellij/ide/structureView/impl/java/JavaClassTreeElementBase.java +++ b/source/com/intellij/ide/structureView/impl/java/JavaClassTreeElementBase.java @@ -1,21 +1,17 @@ package com.intellij.ide.structureView.impl.java; -import com.intellij.ide.util.treeView.smartTree.TreeElement; import com.intellij.ide.structureView.impl.common.PsiTreeElementBase; -import com.intellij.navigation.ItemPresentation; -import com.intellij.openapi.util.Iconable; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiModifier; import com.intellij.psi.PsiModifierListOwner; import com.intellij.psi.util.PsiUtil; -import javax.swing.*; - -public abstract class JavaClassTreeElementBase extends PsiTreeElementBase implements +public abstract class JavaClassTreeElementBase extends PsiTreeElementBase implements AccessLevelProvider { protected final boolean myIsInherited; - protected JavaClassTreeElementBase(boolean isInherited) { + protected JavaClassTreeElementBase(boolean isInherited, PsiElement element) { + super(element); myIsInherited = isInherited; } @@ -24,7 +20,7 @@ public abstract class JavaClassTreeElementBase extends PsiTreeElementBase implem } public boolean isPublic() { - PsiElement element = getElement(); + Value element = getElement(); if (element instanceof PsiModifierListOwner) { return ((PsiModifierListOwner)element).hasModifierProperty(PsiModifier.PUBLIC); } diff --git a/source/com/intellij/ide/structureView/impl/java/JavaFileTreeElement.java b/source/com/intellij/ide/structureView/impl/java/JavaFileTreeElement.java index 102af9bb773b..858e19ce42bb 100644 --- a/source/com/intellij/ide/structureView/impl/java/JavaFileTreeElement.java +++ b/source/com/intellij/ide/structureView/impl/java/JavaFileTreeElement.java @@ -1,69 +1,31 @@ package com.intellij.ide.structureView.impl.java; import com.intellij.ide.structureView.StructureViewTreeElement; +import com.intellij.ide.structureView.impl.common.PsiTreeElementBase; import com.intellij.navigation.ItemPresentation; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiJavaFile; -import com.intellij.openapi.util.Comparing; -import javax.swing.*; import java.util.ArrayList; -public class JavaFileTreeElement implements StructureViewTreeElement, ItemPresentation { - - private final PsiJavaFile myFile; +public class JavaFileTreeElement extends PsiTreeElementBase implements ItemPresentation { public JavaFileTreeElement(PsiJavaFile file) { - myFile = file; + super(file); } - public StructureViewTreeElement[] getChildren() { - PsiClass[] classes = myFile.getClasses(); + public String getPresentableText() { + return getElement().getName(); + } + + public StructureViewTreeElement[] getChildrenBase() { + PsiClass[] classes = getElement().getClasses(); ArrayList result = new ArrayList(); for (int i = 0; i < classes.length; i++) { PsiClass aClass = classes[i]; result.add(new JavaClassTreeElement(aClass, false)); } return result.toArray(new StructureViewTreeElement[result.size()]); - } - public ItemPresentation getPresentation() { - return this; - } - - public Icon getIcon(boolean open) { - return myFile.getVirtualFile().getFileType().getIcon(); - } - - public String getLocationString() { - return null; - } - - public String getPresentableText() { - return myFile.getName(); - } - - public Object getValue() { - return myFile; - } - - public String toString() { - return getPresentableText(); - } - - public int hashCode() { - if (myFile == null) { - return 0; - } else { - return myFile.hashCode(); - } - } - - public boolean equals(Object object) { - if (object instanceof JavaFileTreeElement) { - return Comparing.equal(myFile, ((JavaFileTreeElement)object).myFile); - } else { - return false; - } } } diff --git a/source/com/intellij/ide/structureView/impl/java/PsiFieldTreeElement.java b/source/com/intellij/ide/structureView/impl/java/PsiFieldTreeElement.java index 21d3d68abdb3..e86f2263fe0c 100644 --- a/source/com/intellij/ide/structureView/impl/java/PsiFieldTreeElement.java +++ b/source/com/intellij/ide/structureView/impl/java/PsiFieldTreeElement.java @@ -2,16 +2,12 @@ package com.intellij.ide.structureView.impl.java; import com.intellij.ide.structureView.StructureViewTreeElement; import com.intellij.navigation.ItemPresentation; -import com.intellij.psi.PsiElement; import com.intellij.psi.PsiField; -public class PsiFieldTreeElement extends JavaClassTreeElementBase{ - private final PsiField myField; - +public class PsiFieldTreeElement extends JavaClassTreeElementBase{ public PsiFieldTreeElement(PsiField field, boolean isInherited) { - super(isInherited); - myField = field; - } + super(isInherited,field); + } public StructureViewTreeElement[] getChildrenBase() { return new StructureViewTreeElement[0]; @@ -21,15 +17,11 @@ public class PsiFieldTreeElement extends JavaClassTreeElementBase{ return this; } - public PsiElement getElement() { - return myField; - } - public String getPresentableText() { - return myField.getName(); + return getElement().getName(); } public PsiField getField() { - return myField; + return getElement(); } } diff --git a/source/com/intellij/ide/structureView/impl/java/PsiMethodTreeElement.java b/source/com/intellij/ide/structureView/impl/java/PsiMethodTreeElement.java index b85934e57d46..9160da3287e5 100644 --- a/source/com/intellij/ide/structureView/impl/java/PsiMethodTreeElement.java +++ b/source/com/intellij/ide/structureView/impl/java/PsiMethodTreeElement.java @@ -2,17 +2,13 @@ package com.intellij.ide.structureView.impl.java; import com.intellij.ide.structureView.StructureViewTreeElement; import com.intellij.navigation.ItemPresentation; -import com.intellij.psi.PsiElement; import com.intellij.psi.PsiMethod; import com.intellij.psi.PsiSubstitutor; import com.intellij.psi.util.PsiFormatUtil; -public class PsiMethodTreeElement extends JavaClassTreeElementBase { - private final PsiMethod myMethod; - +public class PsiMethodTreeElement extends JavaClassTreeElementBase { public PsiMethodTreeElement(PsiMethod method, boolean isInherited) { - super(isInherited); - myMethod = method; + super(isInherited,method); } public StructureViewTreeElement[] getChildrenBase() { @@ -23,19 +19,15 @@ public class PsiMethodTreeElement extends JavaClassTreeElementBase { return this; } - public PsiElement getElement() { - return myMethod; - } - public String getPresentableText() { return PsiFormatUtil.formatMethod( - myMethod, + getElement(), PsiSubstitutor.EMPTY, PsiFormatUtil.SHOW_NAME | PsiFormatUtil.SHOW_TYPE | PsiFormatUtil.TYPE_AFTER | PsiFormatUtil.SHOW_PARAMETERS, PsiFormatUtil.SHOW_TYPE ); } public PsiMethod getMethod() { - return myMethod; + return getElement(); } } diff --git a/source/com/intellij/ide/structureView/impl/xml/XmlFileTreeElement.java b/source/com/intellij/ide/structureView/impl/xml/XmlFileTreeElement.java index 05dbdc06bac2..4d16054601cb 100644 --- a/source/com/intellij/ide/structureView/impl/xml/XmlFileTreeElement.java +++ b/source/com/intellij/ide/structureView/impl/xml/XmlFileTreeElement.java @@ -33,30 +33,23 @@ package com.intellij.ide.structureView.impl.xml; import com.intellij.ide.structureView.StructureViewTreeElement; import com.intellij.ide.structureView.impl.common.PsiTreeElementBase; -import com.intellij.psi.PsiElement; import com.intellij.psi.xml.XmlDocument; import com.intellij.psi.xml.XmlFile; -public class XmlFileTreeElement extends PsiTreeElementBase { - private final XmlFile myFile; - +public class XmlFileTreeElement extends PsiTreeElementBase { public XmlFileTreeElement(XmlFile file) { - myFile = file; + super(file); } public StructureViewTreeElement[] getChildrenBase() { - XmlDocument document = myFile.getDocument(); + XmlDocument document = getElement().getDocument(); if (document != null) { return new StructureViewTreeElement[]{new XmlTagTreeElement(document.getRootTag())}; } return new StructureViewTreeElement[0]; } - public PsiElement getElement() { - return myFile; - } - public String getPresentableText() { - return myFile.getName(); + return getElement().getName(); } } diff --git a/source/com/intellij/ide/structureView/impl/xml/XmlTagTreeElement.java b/source/com/intellij/ide/structureView/impl/xml/XmlTagTreeElement.java index 7c70ac50980f..52a41c698e9f 100644 --- a/source/com/intellij/ide/structureView/impl/xml/XmlTagTreeElement.java +++ b/source/com/intellij/ide/structureView/impl/xml/XmlTagTreeElement.java @@ -33,19 +33,16 @@ package com.intellij.ide.structureView.impl.xml; import com.intellij.ide.structureView.StructureViewTreeElement; import com.intellij.ide.structureView.impl.common.PsiTreeElementBase; -import com.intellij.psi.PsiElement; -import com.intellij.psi.xml.XmlTag; import com.intellij.psi.xml.XmlAttribute; +import com.intellij.psi.xml.XmlTag; -public class XmlTagTreeElement extends PsiTreeElementBase{ - private final XmlTag myTag; - +public class XmlTagTreeElement extends PsiTreeElementBase{ public XmlTagTreeElement(XmlTag tag) { - myTag = tag; + super(tag); } public StructureViewTreeElement[] getChildrenBase() { - XmlTag[] subTags = myTag.getSubTags(); + XmlTag[] subTags = getElement().getSubTags(); StructureViewTreeElement[] result = new StructureViewTreeElement[subTags.length]; for (int i = 0; i < result.length; i++) { result[i] = new XmlTagTreeElement(subTags[i]); @@ -53,14 +50,10 @@ public class XmlTagTreeElement extends PsiTreeElementBase{ return result; } - public PsiElement getElement() { - return myTag; - } - public String getPresentableText() { final StringBuffer buffer = new StringBuffer(); - buffer.append(myTag.getName()); - final XmlAttribute[] attributes = myTag.getAttributes(); + buffer.append(getElement().getName()); + final XmlAttribute[] attributes = getElement().getAttributes(); for (int i = 0; i < attributes.length; i++) { appendAttribute(attributes[i], buffer); } diff --git a/source/com/intellij/ide/util/treeView/smartTree/CachingChildrenTreeNode.java b/source/com/intellij/ide/util/treeView/smartTree/CachingChildrenTreeNode.java index d6702a4e3b12..32d8b49f7223 100644 --- a/source/com/intellij/ide/util/treeView/smartTree/CachingChildrenTreeNode.java +++ b/source/com/intellij/ide/util/treeView/smartTree/CachingChildrenTreeNode.java @@ -1,13 +1,15 @@ package com.intellij.ide.util.treeView.smartTree; +import com.intellij.ide.structureView.StructureViewTreeElement; import com.intellij.ide.util.treeView.AbstractTreeNode; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Comparing; import java.util.*; public abstract class CachingChildrenTreeNode extends AbstractTreeNode { private List myChildren; - private List myOldChildren = null; + protected List myOldChildren = null; protected final TreeModel myTreeModel; public CachingChildrenTreeNode(Project project, Value value, TreeModel treeModel) { @@ -174,17 +176,37 @@ public abstract class CachingChildrenTreeNode extends AbstractTreeNode iterator = myOldChildren.iterator(); iterator.hasNext();) { CachingChildrenTreeNode oldInstance = iterator.next(); - if (myChildren.contains(oldInstance)) { - final int newIndex = myChildren.indexOf(oldInstance); + final int newIndex = getIndexOfPointerToTheSameValue(oldInstance); + if (newIndex >= 0) { final CachingChildrenTreeNode newInstance = myChildren.get(newIndex); - oldInstance.copyFromNew(newInstance); + newInstance.copyFromNewInstance(oldInstance); + oldInstance.setValue(newInstance.getValue()); myChildren.set(newIndex, oldInstance); } } } } - protected abstract void copyFromNew(final CachingChildrenTreeNode newInstance); + private int getIndexOfPointerToTheSameValue(final CachingChildrenTreeNode oldInstance) { + for (int i = 0; i < myChildren.size(); i++) { + CachingChildrenTreeNode newInstance = myChildren.get(0); + + if (newInstance instanceof TreeElementWrapper) { + final StructureViewTreeElement newElement = ((StructureViewTreeElement)newInstance.getValue()); + if (oldInstance instanceof TreeElementWrapper) { + final StructureViewTreeElement oldElement = ((StructureViewTreeElement)oldInstance.getValue()); + if (newElement.getValue() != null) { + if (Comparing.equal(newElement.getValue(), oldElement.getValue())) return i; + } + } + } else { + if (newInstance.equals(oldInstance)) return i; + } + } + return -1; + } + + protected abstract void copyFromNewInstance(final CachingChildrenTreeNode newInstance); protected abstract void performTreeActions(); diff --git a/source/com/intellij/ide/util/treeView/smartTree/GroupWrapper.java b/source/com/intellij/ide/util/treeView/smartTree/GroupWrapper.java index da874589864f..62d45dfec499 100644 --- a/source/com/intellij/ide/util/treeView/smartTree/GroupWrapper.java +++ b/source/com/intellij/ide/util/treeView/smartTree/GroupWrapper.java @@ -9,7 +9,7 @@ class GroupWrapper extends CachingChildrenTreeNode { super(project, value, treeModel); } - public void copyFromNew(final CachingChildrenTreeNode newInstance) { + public void copyFromNewInstance(final CachingChildrenTreeNode newInstance) { clearChildren(); setChildren(newInstance.getChildren()); synchronizeChildren(); diff --git a/source/com/intellij/ide/util/treeView/smartTree/TreeElementWrapper.java b/source/com/intellij/ide/util/treeView/smartTree/TreeElementWrapper.java index 3a3f6a445c11..1376bb3e2c5d 100644 --- a/source/com/intellij/ide/util/treeView/smartTree/TreeElementWrapper.java +++ b/source/com/intellij/ide/util/treeView/smartTree/TreeElementWrapper.java @@ -1,6 +1,7 @@ package com.intellij.ide.util.treeView.smartTree; import com.intellij.ide.projectView.PresentationData; +import com.intellij.ide.structureView.StructureViewTreeElement; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; @@ -9,8 +10,7 @@ class TreeElementWrapper extends CachingChildrenTreeNode{ super(project, value, treeModel); } - public void copyFromNew(final CachingChildrenTreeNode newInstance) { - + public void copyFromNewInstance(final CachingChildrenTreeNode oldInstance) { } public void initChildren() { @@ -27,7 +27,9 @@ class TreeElementWrapper extends CachingChildrenTreeNode{ } public void update(PresentationData presentation) { - presentation.updateFrom(getValue().getPresentation()); + if (((StructureViewTreeElement)getValue()).getValue() != null){ + presentation.updateFrom(getValue().getPresentation()); + } } protected void performTreeActions() {