From 9f0327d87383dea1d7705665141c6da37dd9963a Mon Sep 17 00:00:00 2001 From: "Gregory.Shrago" Date: Thu, 19 Jul 2012 18:24:56 +0400 Subject: [PATCH] update documentation hints on selection changes --- .../ide/projectView/impl/ProjectViewTree.java | 4 +-- .../intellij/ui/JBTreeWithHintProvider.java | 32 ++++++++++++++----- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/ide/projectView/impl/ProjectViewTree.java b/platform/lang-impl/src/com/intellij/ide/projectView/impl/ProjectViewTree.java index 06776ef0aad7..ca3b75628bdb 100644 --- a/platform/lang-impl/src/com/intellij/ide/projectView/impl/ProjectViewTree.java +++ b/platform/lang-impl/src/com/intellij/ide/projectView/impl/ProjectViewTree.java @@ -16,7 +16,6 @@ package com.intellij.ide.projectView.impl; -import com.intellij.ide.dnd.aware.DnDAwareTree; import com.intellij.ide.util.treeView.AbstractTreeNode; import com.intellij.ide.util.treeView.NodeDescriptor; import com.intellij.ide.util.treeView.NodeRenderer; @@ -28,6 +27,7 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.util.PsiUtilCore; import com.intellij.ui.ColorUtil; import com.intellij.ui.FileColorManager; +import com.intellij.ui.JBTreeWithHintProvider; import com.intellij.ui.tabs.FileColorManagerImpl; import com.intellij.util.NullableFunction; import org.jetbrains.annotations.NotNull; @@ -41,7 +41,7 @@ import java.awt.*; /** * @author Konstantin Bulenkov */ -public abstract class ProjectViewTree extends DnDAwareTree { +public abstract class ProjectViewTree extends JBTreeWithHintProvider { private final Project myProject; protected ProjectViewTree(Project project, TreeModel model) { diff --git a/platform/lang-impl/src/com/intellij/ui/JBTreeWithHintProvider.java b/platform/lang-impl/src/com/intellij/ui/JBTreeWithHintProvider.java index b2ba5b742010..3339f495479d 100644 --- a/platform/lang-impl/src/com/intellij/ui/JBTreeWithHintProvider.java +++ b/platform/lang-impl/src/com/intellij/ui/JBTreeWithHintProvider.java @@ -15,14 +15,18 @@ */ package com.intellij.ui; +import com.intellij.ide.dnd.aware.DnDAwareTree; +import com.intellij.ide.util.treeView.AbstractTreeNode; +import com.intellij.ide.util.treeView.NodeDescriptor; import com.intellij.openapi.ui.popup.JBPopup; import com.intellij.openapi.ui.popup.PopupChooserBuilder; import com.intellij.psi.PsiElement; import com.intellij.ui.popup.PopupUpdateProcessor; -import com.intellij.ui.treeStructure.Tree; +import org.jetbrains.annotations.Nullable; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; +import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreeModel; import javax.swing.tree.TreeNode; import javax.swing.tree.TreePath; @@ -30,9 +34,9 @@ import javax.swing.tree.TreePath; /** * @author Konstantin Bulenkov */ -public abstract class JBTreeWithHintProvider extends Tree { +public class JBTreeWithHintProvider extends DnDAwareTree { private JBPopup myHint; - + public JBTreeWithHintProvider() { addSelectionListener(); } @@ -51,7 +55,7 @@ public abstract class JBTreeWithHintProvider extends Tree { addTreeSelectionListener(new TreeSelectionListener() { @Override public void valueChanged(final TreeSelectionEvent e) { - if (getClientProperty(PopupChooserBuilder.SELECTED_BY_MOUSE_EVENT) != Boolean.TRUE) { + if (isHintBeingShown() && getClientProperty(PopupChooserBuilder.SELECTED_BY_MOUSE_EVENT) != Boolean.TRUE) { final TreePath path = getSelectionPath(); if (path != null) { final PsiElement psiElement = getPsiElementForHint(path.getLastPathComponent()); @@ -63,8 +67,16 @@ public abstract class JBTreeWithHintProvider extends Tree { } }); } - - protected abstract PsiElement getPsiElementForHint(final Object selectedValue); + + @Nullable + protected PsiElement getPsiElementForHint(final Object selectedValue) { + // default implementation for NodeDescriptor based trees + Object userObject = selectedValue instanceof DefaultMutableTreeNode + ? ((DefaultMutableTreeNode)selectedValue).getUserObject() : null; + Object element = userObject instanceof AbstractTreeNode ? ((AbstractTreeNode)userObject).getValue() : + userObject instanceof NodeDescriptor ? ((NodeDescriptor)userObject).getElement() : null; + return element instanceof PsiElement ? (PsiElement)element : null; + } public void registerHint(final JBPopup hint) { hideHint(); @@ -72,7 +84,7 @@ public abstract class JBTreeWithHintProvider extends Tree { } public void hideHint() { - if (myHint != null && myHint.isVisible()) { + if (isHintBeingShown()) { myHint.cancel(); } @@ -80,11 +92,15 @@ public abstract class JBTreeWithHintProvider extends Tree { } public void updateHint(PsiElement element) { - if (myHint == null || !myHint.isVisible()) return; + if (!isHintBeingShown()) return; final PopupUpdateProcessor updateProcessor = myHint.getUserData(PopupUpdateProcessor.class); if (updateProcessor != null) { updateProcessor.updatePopup(element); } } + + private boolean isHintBeingShown() { + return myHint != null && myHint.isVisible(); + } }