This commit is contained in:
Alexey Kudravtsev
2012-08-31 11:51:14 +04:00
parent 380d890afc
commit d334203fc5
3 changed files with 50 additions and 80 deletions
@@ -37,10 +37,9 @@ import com.intellij.openapi.actionSystem.DataProvider;
import com.intellij.openapi.actionSystem.DefaultActionGroup;
import com.intellij.openapi.actionSystem.PlatformDataKeys;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.extensions.ExtensionPointName;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleUtil;
import com.intellij.openapi.module.ModuleUtilCore;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ModuleRootManager;
import com.intellij.openapi.util.*;
@@ -51,7 +50,7 @@ import com.intellij.openapi.wm.ToolWindowManager;
import com.intellij.pom.Navigatable;
import com.intellij.problems.WolfTheProblemSolver;
import com.intellij.psi.*;
import com.intellij.psi.util.PsiUtilBase;
import com.intellij.psi.util.PsiUtilCore;
import com.intellij.refactoring.move.MoveHandler;
import com.intellij.util.ArrayUtil;
import com.intellij.util.ReflectionCache;
@@ -76,7 +75,6 @@ import java.util.Collections;
import java.util.List;
import java.util.Map;
public abstract class AbstractProjectViewPane implements DataProvider, Disposable, BusyObject {
public static ExtensionPointName<AbstractProjectViewPane> EP_NAME = ExtensionPointName.create("com.intellij.projectViewPane");
@@ -95,23 +93,6 @@ public abstract class AbstractProjectViewPane implements DataProvider, Disposabl
private DnDSource myDragSource;
private DnDManager myDndManager;
private WolfTheProblemSolver.ProblemListener myProblemListener = new WolfTheProblemSolver.ProblemListener() {
@Override
public void problemsAppeared(VirtualFile file) {
queueUpdateByProblem();
}
@Override
public void problemsChanged(VirtualFile file) {
queueUpdateByProblem();
}
@Override
public void problemsDisappeared(VirtualFile file) {
queueUpdateByProblem();
}
};
private void queueUpdateByProblem() {
if (Registry.is("projectView.showHierarchyErrors")) {
if (myTreeBuilder != null) {
@@ -122,14 +103,30 @@ public abstract class AbstractProjectViewPane implements DataProvider, Disposabl
protected AbstractProjectViewPane(Project project) {
myProject = project;
WolfTheProblemSolver.getInstance(project).addProblemListener(myProblemListener, this);
WolfTheProblemSolver.ProblemListener problemListener = new WolfTheProblemSolver.ProblemListener() {
@Override
public void problemsAppeared(@NotNull VirtualFile file) {
queueUpdateByProblem();
}
@Override
public void problemsChanged(@NotNull VirtualFile file) {
queueUpdateByProblem();
}
@Override
public void problemsDisappeared(@NotNull VirtualFile file) {
queueUpdateByProblem();
}
};
WolfTheProblemSolver.getInstance(project).addProblemListener(problemListener, this);
}
protected final void fireTreeChangeListener() {
if (myTreeChangeListener != null) myTreeChangeListener.run();
}
public final void setTreeChangeListener(Runnable listener) {
public final void setTreeChangeListener(@NotNull Runnable listener) {
myTreeChangeListener = listener;
}
@@ -342,7 +339,7 @@ public abstract class AbstractProjectViewPane implements DataProvider, Disposabl
psiElements.add(psiElement);
}
}
return PsiUtilBase.toPsiElementArray(psiElements);
return PsiUtilCore.toPsiElementArray(psiElements);
}
@Nullable
@@ -360,7 +357,7 @@ public abstract class AbstractProjectViewPane implements DataProvider, Disposabl
protected Module getNodeModule(@Nullable final Object element) {
if (element instanceof PsiElement) {
PsiElement psiElement = (PsiElement)element;
return ModuleUtil.findModuleForPsiElement(psiElement);
return ModuleUtilCore.findModuleForPsiElement(psiElement);
}
return null;
}
@@ -538,10 +535,6 @@ public abstract class AbstractProjectViewPane implements DataProvider, Disposabl
// Drag'n'Drop stuff
private static final Logger LOG = Logger.getInstance("com.intellij.ide.projectView.ProjectViewImpl");
@Nullable
public static PsiElement[] getTransferedPsiElements(Transferable transferable) {
try {
@@ -606,7 +599,7 @@ public abstract class AbstractProjectViewPane implements DataProvider, Disposabl
final Object[] elements = getSelectedElements();
final PsiElement[] psiElements = getSelectedPSIElements();
DataContext dataContext = DataManager.getInstance().getDataContext(myTree);
return (psiElements.length > 0) || canDragElements(elements, dataContext, action.getActionId());
return psiElements.length > 0 || canDragElements(elements, dataContext, action.getActionId());
}
@Override
@@ -670,10 +663,7 @@ public abstract class AbstractProjectViewPane implements DataProvider, Disposabl
return true;
}
}
if (dragAction == DnDConstants.ACTION_MOVE) {
return MoveHandler.canMove(dataContext);
}
return false;
return dragAction == DnDConstants.ACTION_MOVE && MoveHandler.canMove(dataContext);
}
@Override
@@ -23,6 +23,7 @@ import com.intellij.ide.bookmarks.BookmarksListener;
import com.intellij.ide.projectView.BaseProjectTreeBuilder;
import com.intellij.ide.projectView.ProjectViewNode;
import com.intellij.ide.projectView.ProjectViewPsiTreeChangeListener;
import com.intellij.ide.util.treeView.AbstractTreeStructure;
import com.intellij.ide.util.treeView.AbstractTreeUpdater;
import com.intellij.ide.util.treeView.NodeDescriptor;
import com.intellij.openapi.application.ModalityState;
@@ -41,6 +42,7 @@ import com.intellij.util.SmartList;
import com.intellij.util.messages.MessageBusConnection;
import gnu.trove.THashSet;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import javax.swing.tree.DefaultMutableTreeNode;
@@ -51,18 +53,15 @@ import java.util.Enumeration;
import java.util.Set;
public class ProjectTreeBuilder extends BaseProjectTreeBuilder {
private final ProjectViewPsiTreeChangeListener myPsiTreeChangeListener;
private final MyFileStatusListener myFileStatusListener;
private final CopyPasteUtil.DefaultCopyPasteListener myCopyPasteListener;
private final WolfTheProblemSolver.ProblemListener myProblemListener;
public ProjectTreeBuilder(final Project project, JTree tree, DefaultTreeModel treeModel, Comparator<NodeDescriptor> comparator, ProjectAbstractTreeStructureBase treeStructure) {
public ProjectTreeBuilder(@NotNull Project project,
@NotNull JTree tree,
@NotNull DefaultTreeModel treeModel,
@Nullable Comparator<NodeDescriptor> comparator,
@NotNull ProjectAbstractTreeStructureBase treeStructure) {
super(project, tree, treeModel, treeStructure, comparator);
final MessageBusConnection connection = project.getMessageBus().connect(this);
myPsiTreeChangeListener = createPsiTreeChangeListener(myProject);
connection.subscribe(ProjectTopics.PROJECT_ROOTS, new ModuleRootAdapter() {
@Override
public void rootsChanged(ModuleRootEvent event) {
@@ -72,29 +71,17 @@ public class ProjectTreeBuilder extends BaseProjectTreeBuilder {
connection.subscribe(BookmarksListener.TOPIC, new MyBookmarksListener());
PsiManager.getInstance(myProject).addPsiTreeChangeListener(myPsiTreeChangeListener);
myFileStatusListener = new MyFileStatusListener();
FileStatusManager.getInstance(myProject).addFileStatusListener(myFileStatusListener);
myCopyPasteListener = new CopyPasteUtil.DefaultCopyPasteListener(getUpdater());
CopyPasteManager.getInstance().addContentChangedListener(myCopyPasteListener);
PsiManager.getInstance(project).addPsiTreeChangeListener(createPsiTreeChangeListener(project), this);
FileStatusManager.getInstance(project).addFileStatusListener(new MyFileStatusListener(), this);
CopyPasteManager.getInstance().addContentChangedListener(new CopyPasteUtil.DefaultCopyPasteListener(getUpdater()), this);
myProblemListener = new MyProblemListener();
WolfTheProblemSolver.getInstance(project).addProblemListener(myProblemListener);
WolfTheProblemSolver.getInstance(project).addProblemListener(new MyProblemListener(), this);
setCanYieldUpdate(true);
initRootNode();
}
@Override
public final void dispose() {
super.dispose();
PsiManager.getInstance(myProject).removePsiTreeChangeListener(myPsiTreeChangeListener);
FileStatusManager.getInstance(myProject).removeFileStatusListener(myFileStatusListener);
CopyPasteManager.getInstance().removeContentChangedListener(myCopyPasteListener);
WolfTheProblemSolver.getInstance(myProject).removeProblemListener(myProblemListener);
}
/**
* Creates psi tree changes listener. This method will be invoked in constructor of ProjectTreeBuilder
* thus builder object will be not completely initialized
@@ -122,7 +109,8 @@ public class ProjectTreeBuilder extends BaseProjectTreeBuilder {
@Override
protected boolean isFlattenPackages(){
return ((AbstractProjectTreeStructure)getTreeStructure()).isFlattenPackages();
AbstractTreeStructure structure = getTreeStructure();
return structure instanceof AbstractProjectTreeStructure && ((AbstractProjectTreeStructure)structure).isFlattenPackages();
}
}
@@ -142,7 +130,7 @@ public class ProjectTreeBuilder extends BaseProjectTreeBuilder {
updateForFile(b.getFile());
}
private void updateForFile(VirtualFile file) {
private void updateForFile(@NotNull VirtualFile file) {
PsiElement element = findPsi(file);
if (element != null) {
queueUpdateFrom(element, false);
@@ -164,15 +152,8 @@ public class ProjectTreeBuilder extends BaseProjectTreeBuilder {
private PsiElement findPsi(@NotNull VirtualFile vFile) {
if (!vFile.isValid()) return null;
PsiElement element;
PsiManager psiManager = PsiManager.getInstance(myProject);
if (vFile.isDirectory()) {
element = psiManager.findDirectory(vFile);
}
else {
element = psiManager.findFile(vFile);
}
return element;
return vFile.isDirectory() ? psiManager.findDirectory(vFile) : psiManager.findFile(vFile);
}
private class MyProblemListener extends WolfTheProblemSolver.ProblemListener {
@@ -180,16 +161,16 @@ public class ProjectTreeBuilder extends BaseProjectTreeBuilder {
private final Collection<VirtualFile> myFilesToRefresh = new THashSet<VirtualFile>();
@Override
public void problemsAppeared(VirtualFile file) {
public void problemsAppeared(@NotNull VirtualFile file) {
queueUpdate(file);
}
@Override
public void problemsDisappeared(VirtualFile file) {
public void problemsDisappeared(@NotNull VirtualFile file) {
queueUpdate(file);
}
private void queueUpdate(final VirtualFile fileToRefresh) {
private void queueUpdate(@NotNull VirtualFile fileToRefresh) {
synchronized (myFilesToRefresh) {
if (myFilesToRefresh.add(fileToRefresh)) {
myUpdateProblemAlarm.cancelAllRequests();
@@ -215,7 +196,7 @@ public class ProjectTreeBuilder extends BaseProjectTreeBuilder {
}
}
private void updateNodesContaining(final Collection<VirtualFile> filesToRefresh, final DefaultMutableTreeNode rootNode) {
private void updateNodesContaining(@NotNull Collection<VirtualFile> filesToRefresh, @NotNull DefaultMutableTreeNode rootNode) {
if (!(rootNode.getUserObject() instanceof ProjectViewNode)) return;
ProjectViewNode node = (ProjectViewNode)rootNode.getUserObject();
Collection<VirtualFile> containingFiles = null;
@@ -27,15 +27,13 @@ import com.intellij.util.ArrayUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
public abstract class AbstractTreeStructureBase extends AbstractTreeStructure {
protected final Project myProject;
private static final Logger LOG = Logger.getInstance("#com.intellij.ide.util.treeView.AbstractTreeStructureBase");
protected final Project myProject;
protected AbstractTreeStructureBase(Project project) {
myProject = project;
@@ -47,7 +45,7 @@ public abstract class AbstractTreeStructureBase extends AbstractTreeStructure {
AbstractTreeNode<?> treeNode = (AbstractTreeNode)element;
Collection<? extends AbstractTreeNode> elements = treeNode.getChildren();
List<TreeStructureProvider> providers = getProvidersDumbAware();
if (providers != null && !providers.isEmpty()) {
if (!providers.isEmpty()) {
ViewSettings settings = treeNode instanceof ProjectViewNode ? ((ProjectViewNode) treeNode).getSettings() : ViewSettings.DEFAULT;
for (TreeStructureProvider provider : providers) {
try {
@@ -95,7 +93,7 @@ public abstract class AbstractTreeStructureBase extends AbstractTreeStructure {
@Nullable
public Object getDataFromProviders(@NotNull List<AbstractTreeNode> selectedNodes, final String dataId) {
final List<TreeStructureProvider> providers = getProvidersDumbAware();
if (providers != null) {
if (!providers.isEmpty()) {
for (TreeStructureProvider treeStructureProvider : providers) {
final Object fromProvider = treeStructureProvider.getData(selectedNodes, dataId);
if (fromProvider != null) {
@@ -106,14 +104,15 @@ public abstract class AbstractTreeStructureBase extends AbstractTreeStructure {
return null;
}
@NotNull
private List<TreeStructureProvider> getProvidersDumbAware() {
if (myProject == null) {
return new ArrayList<TreeStructureProvider>();
return Collections.emptyList();
}
final List<TreeStructureProvider> providers = getProviders();
if (providers == null) {
return null;
return Collections.emptyList();
}
return DumbService.getInstance(myProject).filterByDumbAwareness(providers);