mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
scopes view: simplify expansion state
This commit is contained in:
@@ -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() {
|
||||
|
||||
+20
-1
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user