From 58d277d12aa618b02193d3d10dfd3303bbf7cdf5 Mon Sep 17 00:00:00 2001 From: anna Date: Mon, 25 Jul 2011 16:36:19 +0400 Subject: [PATCH] scopes view: simplify expansion state --- .../ide/scopeView/ScopeTreeViewPanel.java | 54 +++++++------------ .../ui/FileTreeModelBuilder.java | 21 +++++++- 2 files changed, 39 insertions(+), 36 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/ide/scopeView/ScopeTreeViewPanel.java b/platform/lang-impl/src/com/intellij/ide/scopeView/ScopeTreeViewPanel.java index 3a710c73b4e5..77038f4df88e 100644 --- a/platform/lang-impl/src/com/intellij/ide/scopeView/ScopeTreeViewPanel.java +++ b/platform/lang-impl/src/com/intellij/ide/scopeView/ScopeTreeViewPanel.java @@ -53,7 +53,7 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ModuleRootEvent; import com.intellij.openapi.roots.ModuleRootListener; import com.intellij.openapi.roots.ui.configuration.actions.ModuleDeleteProvider; -import com.intellij.openapi.util.*; +import com.intellij.openapi.util.Disposer; import com.intellij.openapi.vcs.FileStatusListener; import com.intellij.openapi.vcs.FileStatusManager; import com.intellij.openapi.vcs.changes.*; @@ -79,7 +79,6 @@ import com.intellij.util.ui.tree.TreeUtil; import com.intellij.util.ui.update.MergingUpdateQueue; import com.intellij.util.ui.update.UiNotifyConnector; import com.intellij.util.ui.update.Update; -import org.jdom.Element; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -95,7 +94,7 @@ import java.util.List; * User: anna * Date: 25-Jan-2006 */ -public class ScopeTreeViewPanel extends JPanel implements JDOMExternalizable, Disposable { +public class ScopeTreeViewPanel extends JPanel implements Disposable { private static final Logger LOG = Logger.getInstance("com.intellij.ide.scopeView.ScopeTreeViewPanel"); private final IdeView myIdeView = new MyIdeView(); private final MyPsiTreeChangeAdapter myPsiTreeChangeAdapter = new MyPsiTreeChangeAdapter(); @@ -104,8 +103,7 @@ public class ScopeTreeViewPanel extends JPanel implements JDOMExternalizable, Di private final Project myProject; private FileTreeModelBuilder myBuilder; - @SuppressWarnings({"WeakerAccess"}) - public String CURRENT_SCOPE_NAME; + private String CURRENT_SCOPE_NAME; private TreeExpansionMonitor myTreeExpansionMonitor; private CopyPasteDelegator myCopyPasteDelegator; @@ -271,6 +269,7 @@ public class ScopeTreeViewPanel extends JPanel implements JDOMExternalizable, Di } }, settings); myTree.setPaintBusy(true); + myBuilder.setTree(myTree); myTree.getEmptyText().setText("Loading..."); myTree.setModel(myBuilder.build(myProject, showProgress, new Runnable(){ @Override @@ -285,14 +284,6 @@ public class ScopeTreeViewPanel extends JPanel implements JDOMExternalizable, Di FileTreeModelBuilder.clearCaches(myProject); } - public void readExternal(Element element) throws InvalidDataException { - DefaultJDOMExternalizer.readExternal(this, element); - } - - public void writeExternal(Element element) throws WriteExternalException { - DefaultJDOMExternalizer.writeExternal(this, element); - } - private NamedScope getCurrentScope() { NamedScope scope = NamedScopesHolder.getScope(myProject, CURRENT_SCOPE_NAME); if (scope == null) { @@ -387,11 +378,19 @@ public class ScopeTreeViewPanel extends JPanel implements JDOMExternalizable, Di return null; } - private void reload(final DefaultMutableTreeNode rootToReload) { + private void reload(@Nullable final DefaultMutableTreeNode rootToReload) { final DefaultTreeModel treeModel = (DefaultTreeModel)myTree.getModel(); if (rootToReload != null) { + final List treePaths = TreeUtil.collectExpandedPaths(myTree, new TreePath(rootToReload.getPath())); + ((DefaultTreeModel)myTree.getModel()).reload(rootToReload); + TreePath path = new TreePath(rootToReload.getPath()); + if (!myTree.isCollapsed(path)) { + myTree.collapsePath(path); + for (TreePath treePath : treePaths) { + myTree.expandPath(treePath); + } + } TreeUtil.sort(rootToReload, getNodeComparator()); - collapseExpand(rootToReload); } else { TreeUtil.sort(treeModel, getNodeComparator()); @@ -486,7 +485,7 @@ public class ScopeTreeViewPanel extends JPanel implements JDOMExternalizable, Di if (parent instanceof PsiDirectory && (child instanceof PsiFile && !isInjected((PsiFile)child) || child instanceof PsiDirectory)) { queueUpdate(new Runnable() { public void run() { - collapseExpand(myBuilder.removeNode(child, (PsiDirectory)parent)); + reload(myBuilder.removeNode(child, (PsiDirectory)parent)); } }, true); } @@ -501,12 +500,12 @@ public class ScopeTreeViewPanel extends JPanel implements JDOMExternalizable, Di final PsiFile file = (PsiFile)child; queueUpdate(new Runnable() { public void run() { - collapseExpand(myBuilder.removeNode(child, (PsiDirectory)oldParent)); + reload(myBuilder.removeNode(child, (PsiDirectory)oldParent)); final VirtualFile virtualFile = file.getVirtualFile(); if (virtualFile != null) { final PsiFile newFile = file.isValid() ? file : PsiManager.getInstance(myProject).findFile(virtualFile); if (newFile != null) { - collapseExpand(myBuilder.addFileNode(newFile)); + reload(myBuilder.addFileNode(newFile)); } } } @@ -524,7 +523,7 @@ public class ScopeTreeViewPanel extends JPanel implements JDOMExternalizable, Di queueUpdate(new Runnable() { public void run() { if (file.isValid()) { - collapseExpand(myBuilder.getFileParentNode(file.getVirtualFile())); + reload(myBuilder.getFileParentNode(file.getVirtualFile())); } } }, false); @@ -587,7 +586,7 @@ public class ScopeTreeViewPanel extends JPanel implements JDOMExternalizable, Di final PackageSet packageSet = scope.getValue(); if (packageSet == null) return; //invalid scope selected if (packageSet.contains(file, NamedScopesHolder.getHolder(myProject, scope.getName(), myDependencyValidationManager))) { - reload(myBuilder.getFileParentNode(file.getVirtualFile())); + reload(myBuilder.findNode(file, file)); } else { reload(myBuilder.removeNode(file, file.getParent())); @@ -599,9 +598,7 @@ public class ScopeTreeViewPanel extends JPanel implements JDOMExternalizable, Di final Runnable wrapped = new Runnable() { public void run() { if (myProject.isDisposed()) return; - myTreeExpansionMonitor.freeze(); request.run(); - myTreeExpansionMonitor.restore(); } }; if (updateImmediately && isTreeShowing()) { @@ -625,17 +622,6 @@ public class ScopeTreeViewPanel extends JPanel implements JDOMExternalizable, Di } } - private void collapseExpand(DefaultMutableTreeNode node) { - if (node == null) return; - ((DefaultTreeModel)myTree.getModel()).reload(node); - TreePath path = new TreePath(node.getPath()); - if (!myTree.isCollapsed(path)) { - myTree.collapsePath(path); - myTree.expandPath(path); - TreeUtil.sort(node, getNodeComparator()); - } - } - private class MyModuleRootListener implements ModuleRootListener { public void beforeRootsChange(ModuleRootEvent event) { } @@ -789,12 +775,10 @@ public class ScopeTreeViewPanel extends JPanel implements JDOMExternalizable, Di myUpdateQueue.queue(new Update(fileToRefresh) { public void run() { if (myProject.isDisposed() || !fileToRefresh.isValid()) return; - myTreeExpansionMonitor.freeze(); final PsiFile psiFile = PsiManager.getInstance(myProject).findFile(fileToRefresh); if (psiFile != null) { reload(rootToReloadGetter.fun(psiFile)); } - myTreeExpansionMonitor.restore(); } public boolean isExpired() { diff --git a/platform/lang-impl/src/com/intellij/packageDependencies/ui/FileTreeModelBuilder.java b/platform/lang-impl/src/com/intellij/packageDependencies/ui/FileTreeModelBuilder.java index 8d624d1bb49f..b2c4bcb53c17 100644 --- a/platform/lang-impl/src/com/intellij/packageDependencies/ui/FileTreeModelBuilder.java +++ b/platform/lang-impl/src/com/intellij/packageDependencies/ui/FileTreeModelBuilder.java @@ -17,6 +17,7 @@ package com.intellij.packageDependencies.ui; import com.intellij.analysis.AnalysisScopeBundle; +import com.intellij.ide.dnd.aware.DnDAwareTree; import com.intellij.ide.projectView.impl.ModuleGroup; import com.intellij.ide.scopeView.nodes.BasePsiNode; import com.intellij.openapi.diagnostic.Logger; @@ -34,14 +35,17 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; +import com.intellij.psi.PsiFileSystemItem; import com.intellij.util.containers.HashSet; import com.intellij.util.ui.tree.TreeUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import javax.swing.*; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.MutableTreeNode; import javax.swing.tree.TreeNode; +import javax.swing.tree.TreePath; import java.util.HashMap; import java.util.Map; import java.util.Set; @@ -69,6 +73,8 @@ public class FileTreeModelBuilder { private int myTotalFileCount = 0; private int myMarkedFileCount = 0; + private JTree myTree; + public FileTreeModelBuilder(Project project, Marker marker, DependenciesPanel.DependencyPanelSettings settings) { myProject = project; final boolean multiModuleProject = ModuleManager.getInstance(myProject).getModules().length > 1; @@ -83,6 +89,9 @@ public class FileTreeModelBuilder { myFileIndex = ProjectRootManager.getInstance(project).getFileIndex(); } + public void setTree(DnDAwareTree tree) { + myTree = tree; + } public static synchronized TreeModel createTreeModel(Project project, boolean showProgress, Set files, Marker marker, DependenciesPanel.DependencyPanelSettings settings) { return new FileTreeModelBuilder(project, marker, settings).build(files, showProgress); @@ -335,7 +344,10 @@ public class FileTreeModelBuilder { } @Nullable - public PackageDependenciesNode findNode(PsiFile file, final PsiElement psiElement) { + public PackageDependenciesNode findNode(PsiFileSystemItem file, final PsiElement psiElement) { + if (file instanceof PsiDirectory) { + return getModuleDirNode(file.getVirtualFile(), myFileIndex.getModuleForFile(file.getVirtualFile()), null); + } PackageDependenciesNode parent = getFileParentNode(file.getVirtualFile()); PackageDependenciesNode[] nodes = findNodeForPsiElement(parent, file); if (nodes == null || nodes.length == 0) { @@ -386,6 +398,10 @@ public class FileTreeModelBuilder { if (myCompactEmptyMiddlePackages) { DirectoryNode nestedNode = ((DirectoryNode)directoryNode).getCompactedDirNode(); if (nestedNode != null) { //decompact + boolean expand = false; + if (myTree != null){ + expand = !myTree.isCollapsed(new TreePath(directoryNode.getPath())); + } DirectoryNode parentWrapper = nestedNode.getWrapper(); while (parentWrapper.getWrapper() != null) { parentWrapper = parentWrapper.getWrapper(); @@ -396,6 +412,9 @@ public class FileTreeModelBuilder { ((DirectoryNode)directoryNode).setCompactedDirNode(null); parentWrapper.add(nestedNode); nestedNode.removeUpReference(); + if (myTree != null && expand) { + myTree.expandPath(new TreePath(nestedNode.getPath())); + } return parentWrapper; } if (directoryNode.getParent() == null) { //find first node in tree