diff --git a/platform/lang-impl/src/com/intellij/ide/projectView/impl/AbstractProjectViewPane.java b/platform/lang-impl/src/com/intellij/ide/projectView/impl/AbstractProjectViewPane.java index c69e3d08f357..1c183e67f9c7 100644 --- a/platform/lang-impl/src/com/intellij/ide/projectView/impl/AbstractProjectViewPane.java +++ b/platform/lang-impl/src/com/intellij/ide/projectView/impl/AbstractProjectViewPane.java @@ -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 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 diff --git a/platform/lang-impl/src/com/intellij/ide/projectView/impl/ProjectTreeBuilder.java b/platform/lang-impl/src/com/intellij/ide/projectView/impl/ProjectTreeBuilder.java index 64611f1397f9..139f49b02385 100644 --- a/platform/lang-impl/src/com/intellij/ide/projectView/impl/ProjectTreeBuilder.java +++ b/platform/lang-impl/src/com/intellij/ide/projectView/impl/ProjectTreeBuilder.java @@ -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 comparator, ProjectAbstractTreeStructureBase treeStructure) { + public ProjectTreeBuilder(@NotNull Project project, + @NotNull JTree tree, + @NotNull DefaultTreeModel treeModel, + @Nullable Comparator 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 myFilesToRefresh = new THashSet(); @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 filesToRefresh, final DefaultMutableTreeNode rootNode) { + private void updateNodesContaining(@NotNull Collection filesToRefresh, @NotNull DefaultMutableTreeNode rootNode) { if (!(rootNode.getUserObject() instanceof ProjectViewNode)) return; ProjectViewNode node = (ProjectViewNode)rootNode.getUserObject(); Collection containingFiles = null; diff --git a/platform/lang-impl/src/com/intellij/ide/util/treeView/AbstractTreeStructureBase.java b/platform/lang-impl/src/com/intellij/ide/util/treeView/AbstractTreeStructureBase.java index 3d04bd08eba3..024dd0cccf8b 100644 --- a/platform/lang-impl/src/com/intellij/ide/util/treeView/AbstractTreeStructureBase.java +++ b/platform/lang-impl/src/com/intellij/ide/util/treeView/AbstractTreeStructureBase.java @@ -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 elements = treeNode.getChildren(); List 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 selectedNodes, final String dataId) { final List 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 getProvidersDumbAware() { if (myProject == null) { - return new ArrayList(); + return Collections.emptyList(); } final List providers = getProviders(); if (providers == null) { - return null; + return Collections.emptyList(); } return DumbService.getInstance(myProject).filterByDumbAwareness(providers);