From cb37330146086c028efa380bc33ccc2a622f18b6 Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Tue, 12 Feb 2013 20:41:48 +0400 Subject: [PATCH] correct copy action for x debug frames list --- .../intellij/xdebugger/frame/XStackFrame.java | 37 +++++++++- .../impl/frame/XDebuggerFramesList.java | 69 +++++++++++++++++++ 2 files changed, 105 insertions(+), 1 deletion(-) diff --git a/platform/xdebugger-api/src/com/intellij/xdebugger/frame/XStackFrame.java b/platform/xdebugger-api/src/com/intellij/xdebugger/frame/XStackFrame.java index f99d59a03db3..e314ddf2d691 100644 --- a/platform/xdebugger-api/src/com/intellij/xdebugger/frame/XStackFrame.java +++ b/platform/xdebugger-api/src/com/intellij/xdebugger/frame/XStackFrame.java @@ -22,8 +22,11 @@ import com.intellij.ui.SimpleTextAttributes; import com.intellij.xdebugger.XDebuggerBundle; import com.intellij.xdebugger.XSourcePosition; import com.intellij.xdebugger.evaluation.XDebuggerEvaluator; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import javax.swing.*; + /** * Represents a frame of execution stack. The selected frame is shown in 'Variables' panel of 'Debug' tool window. * Override {@link XValueContainer#computeChildren} to show local variable, parameters, fields available in the frame @@ -61,9 +64,18 @@ public abstract class XStackFrame extends XValueContainer { /** * Customize presentation of the stack frame in frames list + * * @param component component */ - public void customizePresentation(final SimpleColoredComponent component) { + public void customizePresentation(SimpleColoredComponent component) { + customizePresentation(new ColoredTextContainerComponent(component)); + } + + /** + * Customize presentation of the stack frame in frames list + * @param component component + */ + public void customizePresentation(ColoredTextContainer component) { XSourcePosition position = getSourcePosition(); if (position != null) { //FileColorManager.getInstance() @@ -75,4 +87,27 @@ public abstract class XStackFrame extends XValueContainer { component.append(XDebuggerBundle.message("invalid.frame"), SimpleTextAttributes.ERROR_ATTRIBUTES); } } + + public interface ColoredTextContainer { + void append(@NotNull final String fragment, @NotNull final SimpleTextAttributes attributes); + void setIcon(@Nullable final Icon icon); + } + + static class ColoredTextContainerComponent implements ColoredTextContainer { + private final SimpleColoredComponent component; + + ColoredTextContainerComponent(SimpleColoredComponent component) { + this.component = component; + } + + @Override + public void append(@NotNull String fragment, @NotNull SimpleTextAttributes attributes) { + component.append(fragment, attributes); + } + + @Override + public void setIcon(@Nullable Icon icon) { + component.setIcon(icon); + } + } } diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XDebuggerFramesList.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XDebuggerFramesList.java index f56b10f70fb0..71e90cad4598 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XDebuggerFramesList.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XDebuggerFramesList.java @@ -22,18 +22,24 @@ import com.intellij.psi.PsiManager; import com.intellij.ui.ColoredListCellRenderer; import com.intellij.ui.FileColorManager; import com.intellij.ui.SimpleTextAttributes; +import com.intellij.util.ui.TextTransferrable; import com.intellij.util.ui.UIUtil; import com.intellij.xdebugger.XDebuggerBundle; import com.intellij.xdebugger.XSourcePosition; import com.intellij.xdebugger.frame.XStackFrame; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.*; +import java.awt.datatransfer.Transferable; /** * @author nik */ public class XDebuggerFramesList extends DebuggerFramesList { + private static final TransferHandler defaultTransferHandler = new MyListTransferHandler(); + private XStackFrame mySelectedFrame; public XDebuggerFramesList(Project project) { @@ -106,4 +112,67 @@ public class XDebuggerFramesList extends DebuggerFramesList { stackFrame.customizePresentation(this); } } + + @Override + public TransferHandler getTransferHandler() { + return defaultTransferHandler; + } + + private static class MyColoredTextContainer implements XStackFrame.ColoredTextContainer { + private final StringBuilder builder = new StringBuilder(); + @Override + public void append(@NotNull String fragment, @NotNull SimpleTextAttributes attributes) { + builder.append(fragment); + } + + @Override + public void setIcon(@Nullable Icon icon) { + } + } + + private static class MyListTransferHandler extends TransferHandler { + protected Transferable createTransferable(JComponent c) { + if (!(c instanceof XDebuggerFramesList)) { + return null; + } + XDebuggerFramesList list = (XDebuggerFramesList)c; + Object[] values = list.getSelectedValues(); + if (values == null || values.length == 0) { + return null; + } + + StringBuilder plainBuf = new StringBuilder(); + StringBuilder htmlBuf = new StringBuilder(); + MyColoredTextContainer coloredTextContainer = new MyColoredTextContainer(); + + htmlBuf.append("\n\n\n\n"); + return new TextTransferrable(htmlBuf.toString(), plainBuf.toString()); + } + + public int getSourceActions(JComponent c) { + return COPY; + } + } }