create custom renderer right from the context menu
authorEgor.Ushakov <egor.ushakov@jetbrains.com>
Wed, 2 Sep 2015 16:07:15 +0000 (19:07 +0300)
committerEgor.Ushakov <egor.ushakov@jetbrains.com>
Wed, 2 Sep 2015 16:08:55 +0000 (19:08 +0300)
java/debugger/impl/src/com/intellij/debugger/actions/CreateRendererAction.java [new file with mode: 0644]
java/debugger/impl/src/com/intellij/debugger/settings/NodeRendererSettings.java
java/debugger/impl/src/com/intellij/debugger/settings/UserRenderersConfigurable.java
resources/src/idea/JavaActions.xml

diff --git a/java/debugger/impl/src/com/intellij/debugger/actions/CreateRendererAction.java b/java/debugger/impl/src/com/intellij/debugger/actions/CreateRendererAction.java
new file mode 100644 (file)
index 0000000..8ac0d96
--- /dev/null
@@ -0,0 +1,99 @@
+/*
+ * 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.actions;
+
+import com.intellij.debugger.DebuggerBundle;
+import com.intellij.debugger.engine.DebugProcessImpl;
+import com.intellij.debugger.engine.JavaValue;
+import com.intellij.debugger.engine.events.DebuggerContextCommandImpl;
+import com.intellij.debugger.impl.DebuggerContextImpl;
+import com.intellij.debugger.settings.NodeRendererSettings;
+import com.intellij.debugger.settings.UserRenderersConfigurable;
+import com.intellij.debugger.ui.tree.render.CompoundReferenceRenderer;
+import com.intellij.openapi.actionSystem.AnAction;
+import com.intellij.openapi.actionSystem.AnActionEvent;
+import com.intellij.openapi.options.ConfigurableBase;
+import com.intellij.openapi.options.ex.SingleConfigurableEditor;
+import com.intellij.openapi.project.Project;
+import com.intellij.xdebugger.impl.ui.DebuggerUIUtil;
+import com.sun.jdi.Type;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.List;
+
+public class CreateRendererAction extends AnAction {
+  @Override
+  public void update(AnActionEvent e) {
+    final List<JavaValue> values = ViewAsGroup.getSelectedValues(e);
+    if (values.size() != 1) {
+      e.getPresentation().setEnabledAndVisible(false);
+    }
+  }
+
+  public void actionPerformed(@NotNull final AnActionEvent event) {
+    final DebuggerContextImpl debuggerContext = DebuggerAction.getDebuggerContext(event.getDataContext());
+    final List<JavaValue> values = ViewAsGroup.getSelectedValues(event);
+    if (values.size() != 1) {
+      return;
+    }
+
+    final JavaValue javaValue = values.get(0);
+
+    final DebugProcessImpl process = debuggerContext.getDebugProcess();
+    if (process == null) {
+      return;
+    }
+
+    final Project project = event.getProject();
+
+    process.getManagerThread().schedule(new DebuggerContextCommandImpl(debuggerContext) {
+      public void threadAction() {
+        Type type = javaValue.getDescriptor().getType();
+        final String name = type != null ? type.name() :null;
+        DebuggerUIUtil.invokeLater(new Runnable() {
+          @Override
+          public void run() {
+            final UserRenderersConfigurable ui = new UserRenderersConfigurable();
+            ConfigurableBase<UserRenderersConfigurable, NodeRendererSettings> configurable =
+              new ConfigurableBase<UserRenderersConfigurable, NodeRendererSettings>(
+                                                                      "reference.idesettings.debugger.typerenderers",
+                                                                      DebuggerBundle.message("user.renderers.configurable.display.name"),
+                                                                      "reference.idesettings.debugger.typerenderers") {
+                @NotNull
+                @Override
+                protected NodeRendererSettings getSettings() {
+                  return NodeRendererSettings.getInstance();
+                }
+
+                @Override
+                protected UserRenderersConfigurable createUi() {
+                  return ui;
+                }
+              };
+            SingleConfigurableEditor editor = new SingleConfigurableEditor(project, configurable);
+            if (name != null) {
+              CompoundReferenceRenderer renderer =
+                NodeRendererSettings.getInstance().createCompoundReferenceRenderer(name, name, null, null);
+              renderer.setEnabled(true);
+              ui.addRenderer(renderer);
+            }
+            editor.show();
+          }
+        });
+      }
+    });
+  }
+}
index 4a0b2392df521088e1ec143811cbbbc81a6e3a17..eaf6c37821b13231b2c9326124db79449156e008 100644 (file)
@@ -359,7 +359,7 @@ public class NodeRendererSettings implements PersistentStateComponent<Element> {
     return null;
   }
 
-  private CompoundReferenceRenderer createCompoundReferenceRenderer(
+  public CompoundReferenceRenderer createCompoundReferenceRenderer(
     @NonNls final String rendererName, @NonNls final String className, final ValueLabelRenderer labelRenderer, final ChildrenRenderer childrenRenderer
     ) {
     CompoundReferenceRenderer renderer = new CompoundReferenceRenderer(this, rendererName, labelRenderer, childrenRenderer);
index d92e24319427548f40b9278e56a55570f8b74ccf..8f800f2b352b6ad7c2299859c3679b94a23c305e 100644 (file)
@@ -198,6 +198,10 @@ public final class UserRenderersConfigurable extends JPanel implements Configura
     myRendererDataConfigurable.reset();
   }
 
+  public void addRenderer(NodeRenderer renderer) {
+    myRendererChooser.addElement(renderer, renderer.isEnabled());
+  }
+
   private class AddAction implements AnActionButtonRunnable {
     //public AddAction() {
     //  super(DebuggerBundle.message("button.add"), DebuggerBundle.message("user.renderers.configurable.button.description.add"), ADD_ICON);
@@ -207,7 +211,7 @@ public final class UserRenderersConfigurable extends JPanel implements Configura
     public void run(AnActionButton button) {
       final NodeRenderer renderer = (NodeRenderer)NodeRendererSettings.getInstance().createRenderer(CompoundNodeRenderer.UNIQUE_ID);
       renderer.setEnabled(true);
-      myRendererChooser.addElement(renderer, renderer.isEnabled());
+      addRenderer(renderer);
       SwingUtilities.invokeLater(new Runnable() {
         @Override
         public void run() {
index 9496fe398e728b3226dfd3e0e6b52c2aeaf28abf..5748001c5cbe0c5965fb7d3c6d6c443791f6701f 100644 (file)
     </group>
 
     <group id="Debugger.Representation">
+      <action id="Debugger.CreateRenderer" class="com.intellij.debugger.actions.CreateRendererAction" text="Create..."/>
+      <separator/>
       <action id="Debugger.AutoRenderer" class="com.intellij.debugger.actions.AutoRendererAction"/>
     </group>