scopes view: simplify expansion state

This commit is contained in:
anna
2011-07-26 10:02:14 +04:00
parent 05b06cdfcc
commit 58d277d12a
2 changed files with 39 additions and 36 deletions
@@ -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<TreePath> 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() {
@@ -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<PsiFile> 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