From 7474bfd63ff54eb0d6b217df926e3372c13b8d51 Mon Sep 17 00:00:00 2001 From: "Egor.Ushakov" Date: Wed, 11 Feb 2015 19:35:41 +0300 Subject: [PATCH] image renderer for SunGraphics2D --- .../engine/FullValueEvaluatorProvider.java | 9 +-- .../intellij/debugger/engine/JavaValue.java | 6 +- .../settings/GraphicsObjectRenderer.java | 64 +++++++++++++++++++ .../debugger/settings/IconObjectRenderer.java | 4 +- .../settings/ImageObjectRenderer.java | 3 +- resources/src/META-INF/IdeaPlugin.xml | 1 + 6 files changed, 78 insertions(+), 9 deletions(-) create mode 100644 java/debugger/impl/src/com/intellij/debugger/settings/GraphicsObjectRenderer.java diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/FullValueEvaluatorProvider.java b/java/debugger/impl/src/com/intellij/debugger/engine/FullValueEvaluatorProvider.java index 3d03d68750db..1d3f7e079fee 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/FullValueEvaluatorProvider.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/FullValueEvaluatorProvider.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,11 +18,12 @@ package com.intellij.debugger.engine; import com.intellij.debugger.engine.evaluation.EvaluationContextImpl; import com.intellij.debugger.ui.impl.watch.ValueDescriptorImpl; import com.intellij.xdebugger.frame.XFullValueEvaluator; -import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; /** - * Created by Egor on 04.10.2014. + * @author egor */ public interface FullValueEvaluatorProvider { - @NotNull XFullValueEvaluator getFullValueEvaluator(EvaluationContextImpl evaluationContext, ValueDescriptorImpl valueDescriptor); + @Nullable + XFullValueEvaluator getFullValueEvaluator(EvaluationContextImpl evaluationContext, ValueDescriptorImpl valueDescriptor); } diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/JavaValue.java b/java/debugger/impl/src/com/intellij/debugger/engine/JavaValue.java index b58e35e2ab78..cd1aab494cee 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/JavaValue.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/JavaValue.java @@ -146,7 +146,11 @@ public class JavaValue extends XNamedValue implements NodeDescriptorProvider, XV presentation = new JavaValuePresentation(value, myValueDescriptor.getIdLabel(), exception != null ? exception.getMessage() : null, myValueDescriptor); if (myValueDescriptor.getLastRenderer() instanceof FullValueEvaluatorProvider) { - node.setFullValueEvaluator(((FullValueEvaluatorProvider)myValueDescriptor.getLastRenderer()).getFullValueEvaluator(myEvaluationContext, myValueDescriptor)); + XFullValueEvaluator evaluator = ((FullValueEvaluatorProvider)myValueDescriptor.getLastRenderer()) + .getFullValueEvaluator(myEvaluationContext, myValueDescriptor); + if (evaluator != null) { + node.setFullValueEvaluator(evaluator); + } } else if (value.length() > XValueNode.MAX_VALUE_LENGTH) { node.setFullValueEvaluator(new XFullValueEvaluator() { diff --git a/java/debugger/impl/src/com/intellij/debugger/settings/GraphicsObjectRenderer.java b/java/debugger/impl/src/com/intellij/debugger/settings/GraphicsObjectRenderer.java new file mode 100644 index 000000000000..d770da07ea1b --- /dev/null +++ b/java/debugger/impl/src/com/intellij/debugger/settings/GraphicsObjectRenderer.java @@ -0,0 +1,64 @@ +/* + * Copyright 2000-2015 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.debugger.settings; + +import com.intellij.debugger.DebuggerBundle; +import com.intellij.debugger.engine.DebuggerUtils; +import com.intellij.debugger.engine.FullValueEvaluatorProvider; +import com.intellij.debugger.engine.evaluation.EvaluationContextImpl; +import com.intellij.debugger.ui.impl.watch.ValueDescriptorImpl; +import com.intellij.xdebugger.frame.XFullValueEvaluator; +import com.sun.jdi.*; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; + +/** + * @author egor + */ +public class GraphicsObjectRenderer extends ToStringBasedRenderer implements FullValueEvaluatorProvider { + public GraphicsObjectRenderer(final NodeRendererSettings rendererSettings) { + super(rendererSettings, "Graphics", null, null); + setClassName("sun.java2d.SunGraphics2D"); + setEnabled(true); + } + + @Nullable + @Override + public XFullValueEvaluator getFullValueEvaluator(final EvaluationContextImpl evaluationContext, final ValueDescriptorImpl valueDescriptor) { + try { + ObjectReference value = (ObjectReference)valueDescriptor.getValue(); + Field surfaceField = ((ClassType)value.type()).fieldByName("surfaceData"); + if (surfaceField == null) return null; + ObjectReference surfaceDataValue = (ObjectReference)value.getValue(surfaceField); + final Field bufImgField = ((ClassType)surfaceDataValue.type()).fieldByName("bufImg"); + if (bufImgField == null) return null; + final Value bufImgValue = surfaceDataValue.getValue(bufImgField); + Type type = bufImgValue.type(); + if (!(type instanceof ReferenceType) || !DebuggerUtils.instanceOf(type, "java.awt.Image")) { + return null; + } + return new CustomPopupFullValueEvaluator(DebuggerBundle.message("message.node.show.image"), evaluationContext) { + @Override + protected JComponent createComponent() { + return ImageObjectRenderer.createIconViewer(ImageObjectRenderer.getIcon(myEvaluationContext, bufImgValue, + "imageToBytes")); + } + }; + } catch (Exception ignored) {} + return null; + } +} diff --git a/java/debugger/impl/src/com/intellij/debugger/settings/IconObjectRenderer.java b/java/debugger/impl/src/com/intellij/debugger/settings/IconObjectRenderer.java index 427ee3f49368..21c1e187ae4d 100644 --- a/java/debugger/impl/src/com/intellij/debugger/settings/IconObjectRenderer.java +++ b/java/debugger/impl/src/com/intellij/debugger/settings/IconObjectRenderer.java @@ -25,7 +25,7 @@ import com.intellij.debugger.ui.tree.ValueDescriptor; import com.intellij.debugger.ui.tree.render.DescriptorLabelListener; import com.intellij.icons.AllIcons; import com.intellij.xdebugger.frame.XFullValueEvaluator; -import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import javax.swing.*; @@ -46,7 +46,7 @@ class IconObjectRenderer extends ToStringBasedRenderer implements FullValueEvalu return ImageObjectRenderer.getIcon(evaluationContext, descriptor.getValue(), getterName); } - @NotNull + @Nullable @Override public XFullValueEvaluator getFullValueEvaluator(final EvaluationContextImpl evaluationContext, final ValueDescriptorImpl valueDescriptor) { return new CustomPopupFullValueEvaluator(DebuggerBundle.message("message.node.show.icon"), evaluationContext) { diff --git a/java/debugger/impl/src/com/intellij/debugger/settings/ImageObjectRenderer.java b/java/debugger/impl/src/com/intellij/debugger/settings/ImageObjectRenderer.java index 93a173b6a6c7..99c4838dedf6 100644 --- a/java/debugger/impl/src/com/intellij/debugger/settings/ImageObjectRenderer.java +++ b/java/debugger/impl/src/com/intellij/debugger/settings/ImageObjectRenderer.java @@ -26,7 +26,6 @@ import com.intellij.rt.debugger.ImageSerializer; import com.intellij.xdebugger.frame.XFullValueEvaluator; import com.sun.jdi.*; import org.intellij.images.editor.impl.ImageEditorManagerImpl; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; @@ -45,7 +44,7 @@ class ImageObjectRenderer extends ToStringBasedRenderer implements FullValueEval setEnabled(true); } - @NotNull + @Nullable @Override public XFullValueEvaluator getFullValueEvaluator(final EvaluationContextImpl evaluationContext, final ValueDescriptorImpl valueDescriptor) { return new CustomPopupFullValueEvaluator(DebuggerBundle.message("message.node.show.image"), evaluationContext) { diff --git a/resources/src/META-INF/IdeaPlugin.xml b/resources/src/META-INF/IdeaPlugin.xml index 8874b060d179..bb2fde3b3064 100644 --- a/resources/src/META-INF/IdeaPlugin.xml +++ b/resources/src/META-INF/IdeaPlugin.xml @@ -1498,6 +1498,7 @@ +