removed redundant extension point
[idea/community.git] / python / edu / src / com / jetbrains / python / edu / debugger / PyEduStackFrame.java
1 package com.jetbrains.python.edu.debugger;
2
3 import com.intellij.icons.AllIcons;
4 import com.intellij.openapi.project.Project;
5 import com.intellij.openapi.vfs.VirtualFile;
6 import com.intellij.ui.ColoredTextContainer;
7 import com.intellij.ui.SimpleTextAttributes;
8 import com.intellij.util.containers.hash.HashMap;
9 import com.intellij.xdebugger.XSourcePosition;
10 import com.intellij.xdebugger.frame.XCompositeNode;
11 import com.intellij.xdebugger.frame.XValue;
12 import com.intellij.xdebugger.frame.XValueChildrenList;
13 import com.jetbrains.python.debugger.PyFrameAccessor;
14 import com.jetbrains.python.debugger.PyStackFrame;
15 import com.jetbrains.python.debugger.PyStackFrameInfo;
16 import org.jetbrains.annotations.NotNull;
17 import org.jetbrains.annotations.Nullable;
18
19 import java.util.Map;
20
21 public class PyEduStackFrame extends PyStackFrame {
22   public static final String MODULE = "<module>";
23   public static final String GLOBAL_FRAME = "Globals";
24   public static final String DOUBLE_UNDERSCORE = "__";
25   private final PyStackFrameInfo myFrameInfo;
26   private final XSourcePosition myPosition;
27
28   public PyEduStackFrame(@NotNull Project project,
29                          @NotNull PyFrameAccessor debugProcess,
30                          @NotNull PyStackFrameInfo frameInfo,
31                          XSourcePosition position) {
32     super(project, debugProcess, frameInfo, position);
33     myFrameInfo = frameInfo;
34     myPosition = position;
35   }
36
37   @Override
38   public void customizePresentation(@NotNull ColoredTextContainer component) {
39     component.setIcon(AllIcons.Debugger.StackFrame);
40     if (myPosition == null) {
41       component.append("<frame not available>", SimpleTextAttributes.GRAY_ATTRIBUTES);
42       return;
43     }
44
45     final VirtualFile file = myPosition.getFile();
46
47     String frameName = myFrameInfo.getName();
48     component.setIcon(MODULE.equals(frameName) ? AllIcons.FileTypes.Text : AllIcons.Nodes.Field);
49     SimpleTextAttributes regularAttributes = SimpleTextAttributes.REGULAR_ATTRIBUTES;
50     if (MODULE.equals(frameName)) {
51       component.append(GLOBAL_FRAME, regularAttributes);
52       component.append(" (" + file.getName() + ")", getGrayAttributes(regularAttributes));
53     }
54     else {
55       component
56         .append(MODULE.equals(frameName) ? GLOBAL_FRAME : frameName, regularAttributes);
57     }
58   }
59
60   @Override
61   protected void addChildren(@NotNull final XCompositeNode node,
62                              @Nullable final XValueChildrenList children) {
63     Map<String, XValue> specialValues = new HashMap<String, XValue>();
64     XValueChildrenList newChildren = new XValueChildrenList();
65     if (children == null) {
66       node.addChildren(XValueChildrenList.EMPTY, true);
67       return;
68     }
69     for (int i = 0; i < children.size(); i++) {
70       String name = children.getName(i);
71       XValue value = children.getValue(i);
72       if (name.startsWith(DOUBLE_UNDERSCORE) && name.endsWith(DOUBLE_UNDERSCORE)) {
73         specialValues.put(name, value);
74       }
75       else {
76         newChildren.add(name, value);
77       }
78     }
79     if (!specialValues.isEmpty()) {
80       newChildren.add(new PyEduMagicDebugValue("special variables", specialValues));
81     }
82     node.addChildren(newChildren, true);
83   }
84 }