From 443507611ce361f363aea7cdffb2085a0eddfe75 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 5 Oct 2015 16:00:32 +0300 Subject: [PATCH] DBE-1572 Copy content from structure popup: fallback to presentation items [^savenko] --- .../intellij/ide/util/FileStructurePopup.java | 37 +++++++++++-------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/ide/util/FileStructurePopup.java b/platform/lang-impl/src/com/intellij/ide/util/FileStructurePopup.java index 5c723241b2e9..1c8c7ae5613f 100644 --- a/platform/lang-impl/src/com/intellij/ide/util/FileStructurePopup.java +++ b/platform/lang-impl/src/com/intellij/ide/util/FileStructurePopup.java @@ -53,7 +53,6 @@ import com.intellij.openapi.project.DumbAwareAction; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.popup.*; import com.intellij.openapi.util.*; -import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.wm.IdeFocusManager; import com.intellij.psi.PsiDocumentManager; @@ -69,10 +68,7 @@ import com.intellij.ui.treeStructure.AlwaysExpandedTree; import com.intellij.ui.treeStructure.Tree; import com.intellij.ui.treeStructure.filtered.FilteringTreeBuilder; import com.intellij.ui.treeStructure.filtered.FilteringTreeStructure; -import com.intellij.util.Alarm; -import com.intellij.util.ArrayUtil; -import com.intellij.util.Function; -import com.intellij.util.ReflectionUtil; +import com.intellij.util.*; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.Convertor; import com.intellij.util.containers.HashSet; @@ -211,20 +207,31 @@ public class FileStructurePopup implements Disposable, TreeActionsOwner { @Nullable @Override protected Transferable createTransferable(JComponent component) { - Set selection = ContainerUtil.newLinkedHashSet(getPsiElementsFromSelection()); - if (selection.isEmpty()) return null; - List result = ContainerUtil.newArrayListWithCapacity(selection.size()); - for (PsiElement e : selection) { - if (!selection.contains(e.getParent())) { - result.add(e); - } + Set nodes = myAbstractTreeBuilder.getSelectedElements(); + if (nodes.isEmpty()) return null; + List> result = ContainerUtil.newArrayListWithCapacity(nodes.size()); + for (Object o : nodes) { + if (!(o instanceof FilteringTreeStructure.FilteringNode)) continue; + FilteringTreeStructure.FilteringNode node = (FilteringTreeStructure.FilteringNode)o; + PsiElement psi = getPsi(node); + ContainerUtil.addIfNotNull(result, Pair.create(node, psi)); } - String text = StringUtil.join(result, new Function() { + + final Set psiSelection = ContainerUtil.map2LinkedSet(result, Functions.pairSecond()); + + String text = StringUtil.join(result, new Function, String>() { @Override - public String fun(PsiElement e) { - return e.getText(); + public String fun(Pair pair) { + PsiElement psi = pair.second; + String defaultPresentation = pair.first.getPresentation().getPresentableText(); + if (psi == null) return defaultPresentation; + for (PsiElement p = psi.getParent(); p != null; p = p.getParent()) { + if (psiSelection.contains(p)) return null; + } + return ObjectUtils.chooseNotNull(psi.getText(), defaultPresentation); } }, "\n"); + String htmlText = "\n" + text + "\n"; return new TextTransferable(XmlStringUtil.wrapInHtml(htmlText), text); }