changed presentation of some debug values
authorliana.bakradze <liana.bakradze@jetbrains.com>
Wed, 19 Aug 2015 11:07:54 +0000 (14:07 +0300)
committerliana.bakradze <liana.bakradze@jetbrains.com>
Wed, 19 Aug 2015 11:07:54 +0000 (14:07 +0300)
There is no need in custom DebugValue because we have XVaueGroup. Also changed the name of new special value after discussion.

python/edu/src/com/jetbrains/python/edu/debugger/PyEduMagicDebugValue.java [deleted file]
python/edu/src/com/jetbrains/python/edu/debugger/PyEduStackFrame.java

diff --git a/python/edu/src/com/jetbrains/python/edu/debugger/PyEduMagicDebugValue.java b/python/edu/src/com/jetbrains/python/edu/debugger/PyEduMagicDebugValue.java
deleted file mode 100644 (file)
index ddb2f4d..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-package com.jetbrains.python.edu.debugger;
-
-
-import com.intellij.icons.AllIcons;
-import com.intellij.xdebugger.frame.*;
-import com.intellij.xdebugger.frame.presentation.XValuePresentation;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.Map;
-
-/**
- * Represents debug value for content that should be hidden from the python beginners
- * (e.g. values named with double underscore prefix and postfix)
- */
-public class PyEduMagicDebugValue extends XNamedValue {
-
-  private final Map<String, XValue> myValues;
-
-  protected PyEduMagicDebugValue(@NotNull String name, Map<String, XValue> values) {
-    super(name);
-    myValues = values;
-  }
-
-  @Override
-  public void computePresentation(@NotNull XValueNode node, @NotNull XValuePlace place) {
-    node.setPresentation(AllIcons.Nodes.Artifact, new XValuePresentation() {
-
-      @Override
-      public void renderValue(@NotNull XValueTextRenderer renderer) {
-        renderer.renderComment("{Python Pro Only}");
-      }
-
-      @NotNull
-      @Override
-      public String getSeparator() {
-        return " ";
-      }
-    }, true);
-  }
-
-  @Override
-  public void computeChildren(@NotNull XCompositeNode node) {
-    XValueChildrenList children = new XValueChildrenList();
-    for (Map.Entry<String, XValue> entry : myValues.entrySet()) {
-      children.add(entry.getKey(), entry.getValue());
-    }
-    node.addChildren(children, true);
-  }
-}
\ No newline at end of file
index f88c23e7dc7ea4079eb8b2888ae920db16c9ead1..f9b3f172cf655ac8e730a70a91e9194f32e9c6dd 100644 (file)
@@ -5,23 +5,27 @@ import com.intellij.openapi.project.Project;
 import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.ui.ColoredTextContainer;
 import com.intellij.ui.SimpleTextAttributes;
-import com.intellij.util.containers.hash.HashMap;
 import com.intellij.xdebugger.XSourcePosition;
 import com.intellij.xdebugger.frame.XCompositeNode;
 import com.intellij.xdebugger.frame.XValue;
 import com.intellij.xdebugger.frame.XValueChildrenList;
+import com.intellij.xdebugger.frame.XValueGroup;
 import com.jetbrains.python.debugger.PyFrameAccessor;
 import com.jetbrains.python.debugger.PyStackFrame;
 import com.jetbrains.python.debugger.PyStackFrameInfo;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
+import javax.swing.*;
+import java.util.HashMap;
 import java.util.Map;
 
 public class PyEduStackFrame extends PyStackFrame {
   public static final String MODULE = "<module>";
   public static final String GLOBAL_FRAME = "Globals";
   public static final String DOUBLE_UNDERSCORE = "__";
+  public static final String BUILTINS_VALUE_NAME = "__builtins__";
+
   private final PyStackFrameInfo myFrameInfo;
   private final XSourcePosition myPosition;
 
@@ -36,49 +40,75 @@ public class PyEduStackFrame extends PyStackFrame {
 
   @Override
   public void customizePresentation(@NotNull ColoredTextContainer component) {
-    component.setIcon(AllIcons.Debugger.StackFrame);
     if (myPosition == null) {
       component.append("<frame not available>", SimpleTextAttributes.GRAY_ATTRIBUTES);
       return;
     }
-
     final VirtualFile file = myPosition.getFile();
-
     String frameName = myFrameInfo.getName();
+    //TODO: get icons from designers
     component.setIcon(MODULE.equals(frameName) ? AllIcons.FileTypes.Text : AllIcons.Nodes.Field);
-    SimpleTextAttributes regularAttributes = SimpleTextAttributes.REGULAR_ATTRIBUTES;
     if (MODULE.equals(frameName)) {
-      component.append(GLOBAL_FRAME, regularAttributes);
-      component.append(" (" + file.getName() + ")", getGrayAttributes(regularAttributes));
+      component.append(GLOBAL_FRAME, SimpleTextAttributes.REGULAR_ATTRIBUTES);
+      component.append(" (" + file.getName() + ")", getGrayAttributes(SimpleTextAttributes.REGULAR_ATTRIBUTES));
     }
     else {
-      component
-        .append(MODULE.equals(frameName) ? GLOBAL_FRAME : frameName, regularAttributes);
+      component.append(frameName, SimpleTextAttributes.REGULAR_ATTRIBUTES);
     }
   }
 
   @Override
   protected void addChildren(@NotNull final XCompositeNode node,
                              @Nullable final XValueChildrenList children) {
-    Map<String, XValue> specialValues = new HashMap<String, XValue>();
-    XValueChildrenList newChildren = new XValueChildrenList();
     if (children == null) {
       node.addChildren(XValueChildrenList.EMPTY, true);
       return;
     }
+    final Map<String, XValue> specialValues = new HashMap<String, XValue>();
+    XValueChildrenList filteredChildren = new XValueChildrenList();
     for (int i = 0; i < children.size(); i++) {
       String name = children.getName(i);
       XValue value = children.getValue(i);
       if (name.startsWith(DOUBLE_UNDERSCORE) && name.endsWith(DOUBLE_UNDERSCORE)) {
         specialValues.put(name, value);
+        continue;
       }
-      else {
-        newChildren.add(name, value);
-      }
+      filteredChildren.add(name, value);
     }
-    if (!specialValues.isEmpty()) {
-      newChildren.add(new PyEduMagicDebugValue("special variables", specialValues));
+    node.addChildren(filteredChildren, specialValues.isEmpty());
+    if (specialValues.isEmpty()) {
+      return;
     }
-    node.addChildren(newChildren, true);
+    addSpecialVars(node, specialValues);
+  }
+
+  private static void addSpecialVars(@NotNull XCompositeNode node, Map<String, XValue> specialValues) {
+      XValue builtins = specialValues.get(BUILTINS_VALUE_NAME);
+      if (builtins != null) {
+        specialValues.remove(BUILTINS_VALUE_NAME);
+        node.addChildren(XValueChildrenList.singleton("Builtins", builtins), false);
+      }
+      node.addChildren(XValueChildrenList.bottomGroup(createSpecialVarsGroup(specialValues)), true);
+  }
+
+  @NotNull
+  private static XValueGroup createSpecialVarsGroup(final Map<String, XValue> specialValues) {
+    return new XValueGroup("Special Variables") {
+      @Nullable
+      @Override
+      public Icon getIcon() {
+        //TODO: get icon from designers
+        return AllIcons.Nodes.Artifact;
+      }
+
+      @Override
+      public void computeChildren(@NotNull XCompositeNode node) {
+        XValueChildrenList list = new XValueChildrenList();
+        for (Map.Entry<String, XValue> entry : specialValues.entrySet()) {
+          list.add(entry.getKey(), entry.getValue());
+        }
+        node.addChildren(list, true);
+      }
+    };
   }
 }