From 9933a4bf22b703181c477504309c537abcb7a4de Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Thu, 24 Sep 2015 11:33:09 +0300 Subject: [PATCH] copy psi text from structure view --- .../intellij/ide/util/FileStructurePopup.java | 51 ++++++++++++++++--- 1 file changed, 43 insertions(+), 8 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 5e67fe6cc371..9f617bf9c4a2 100644 --- a/platform/lang-impl/src/com/intellij/ide/util/FileStructurePopup.java +++ b/platform/lang-impl/src/com/intellij/ide/util/FileStructurePopup.java @@ -71,13 +71,16 @@ 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.containers.ContainerUtil; import com.intellij.util.containers.Convertor; import com.intellij.util.containers.HashSet; import com.intellij.util.ui.JBUI; +import com.intellij.util.ui.TextTransferable; import com.intellij.util.ui.UIUtil; import com.intellij.util.ui.tree.TreeUtil; +import com.intellij.xml.util.XmlStringUtil; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -89,6 +92,7 @@ import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreePath; import java.awt.*; import java.awt.datatransfer.DataFlavor; +import java.awt.datatransfer.Transferable; import java.awt.event.*; import java.util.*; import java.util.List; @@ -203,6 +207,32 @@ public class FileStructurePopup implements Disposable, TreeActionsOwner { } return false; } + + @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); + } + } + String text = StringUtil.join(result, new Function() { + @Override + public String fun(PsiElement e) { + return e.getText(); + } + }, "\n"); + String htmlText = "\n" + text + "\n"; + return new TextTransferable(XmlStringUtil.wrapInHtml(htmlText), text); + } + + @Override + public int getSourceActions(JComponent component) { + return COPY; + } }); mySpeedSearch = new MyTreeSpeedSearch(); @@ -637,14 +667,7 @@ public class FileStructurePopup implements Disposable, TreeActionsOwner { return getPsi((FilteringTreeStructure.FilteringNode)node); } if (LangDataKeys.PSI_ELEMENT_ARRAY.is(dataId)) { - Set nodes = myAbstractTreeBuilder.getSelectedElements(); - if (nodes.isEmpty()) return PsiElement.EMPTY_ARRAY; - ArrayList result = new ArrayList(); - for (Object o : nodes) { - if (!(o instanceof FilteringTreeStructure.FilteringNode)) continue; - ContainerUtil.addIfNotNull(result, getPsi((FilteringTreeStructure.FilteringNode)o)); - } - return ContainerUtil.toArray(result, PsiElement.ARRAY_FACTORY); + return ContainerUtil.toArray(getPsiElementsFromSelection(), PsiElement.ARRAY_FACTORY); } if (LangDataKeys.POSITION_ADJUSTER_POPUP.is(dataId)) { return myPopup; @@ -666,6 +689,18 @@ public class FileStructurePopup implements Disposable, TreeActionsOwner { return panel; } + @NotNull + private List getPsiElementsFromSelection() { + Set nodes = myAbstractTreeBuilder.getSelectedElements(); + if (nodes.isEmpty()) return Collections.emptyList(); + List result = ContainerUtil.newArrayListWithCapacity(nodes.size()); + for (Object o : nodes) { + if (!(o instanceof FilteringTreeStructure.FilteringNode)) continue; + ContainerUtil.addIfNotNull(result, getPsi((FilteringTreeStructure.FilteringNode)o)); + } + return result; + } + @NotNull protected JComponent createSettingsButton() { final JLabel label = new JLabel(AllIcons.General.SecondaryGroup);