PY-21230 Open numeric container viewers from "View" hyperlink appcode/171.451
authorLiana.Bakradze <liana.bakradze@jetbrains.com>
Mon, 10 Oct 2016 14:53:02 +0000 (17:53 +0300)
committerLiana.Bakradze <liana.bakradze@jetbrains.com>
Tue, 25 Oct 2016 15:03:49 +0000 (18:03 +0300)
python/pydevSrc/com/jetbrains/python/debugger/PyDebugValue.java
python/pydevSrc/com/jetbrains/python/debugger/PyFrameAccessor.java
python/pydevSrc/com/jetbrains/python/debugger/PyFullValueEvaluator.java
python/pydevSrc/com/jetbrains/python/debugger/PyNumericContainerValueEvaluator.java [new file with mode: 0644]
python/src/com/jetbrains/python/debugger/PyDebugProcess.java
python/src/com/jetbrains/python/debugger/containerview/PyViewNumericContainerAction.java

index 5737592904ede6b85a579638299a0c6d276b77ec..95158de36ea41e316ddd5a80706480e2ea782d07 100644 (file)
@@ -88,7 +88,7 @@ public class PyDebugValue extends XNamedValue {
   public boolean isErrorOnEval() {
     return myErrorOnEval;
   }
-  
+
   public PyDebugValue setParent(@Nullable PyDebugValue parent) {
     return new PyDebugValue(myName, myType, myTypeQualifier, myValue, myContainer, myIsReturnedVal, myIsIPythonHidden, myErrorOnEval,
                             parent, myFrameAccessor);
@@ -197,15 +197,33 @@ public class PyDebugValue extends XNamedValue {
   @Override
   public void computePresentation(@NotNull XValueNode node, @NotNull XValuePlace place) {
     String value = PyTypeHandler.format(this);
-
+    setFullValueEvaluator(node, value);
     if (value.length() >= MAX_VALUE) {
-      node.setFullValueEvaluator(new PyFullValueEvaluator(myFrameAccessor, getFullTreeName()));
       value = value.substring(0, MAX_VALUE);
     }
-
     node.setPresentation(getValueIcon(), myType, value, myContainer);
   }
 
+  private boolean isDataFrame() {
+    return "DataFrame".equals(myType);
+  }
+
+  private boolean isNdarray() {
+    return "ndarray".equals(myType);
+  }
+
+  private void setFullValueEvaluator(XValueNode node, String value) {
+    String treeName = getFullTreeName();
+    if (!isDataFrame() && !isNdarray()) {
+      if (value.length() >= MAX_VALUE) {
+        node.setFullValueEvaluator(new PyFullValueEvaluator(myFrameAccessor, treeName));
+      }
+      return;
+    }
+    String linkText = "...View as " + (isDataFrame() ? "DataFrame" : "Array");
+    node.setFullValueEvaluator(new PyNumericContainerValueEvaluator(linkText, myFrameAccessor, treeName));
+  }
+
   @Override
   public void computeChildren(@NotNull final XCompositeNode node) {
     if (node.isObsolete()) return;
@@ -243,7 +261,7 @@ public class PyDebugValue extends XNamedValue {
       return AllIcons.Debugger.Value;
     }
   }
-  
+
   public PyDebugValue setName(String newName) {
     PyDebugValue value = new PyDebugValue(newName, myType, myTypeQualifier, myValue, myContainer, myIsReturnedVal, myIsIPythonHidden,
                                           myErrorOnEval, myParent, myFrameAccessor);
index 0bb4ee11606a1778eb7b901baf783f1de48a0841..5c752effc96514752b56bed2ff00e2c17fa7c1a8 100644 (file)
@@ -29,4 +29,6 @@ public interface PyFrameAccessor {
 
   @Nullable
   XSourcePosition getSourcePositionForType(String type);
+
+  default void showNumericContainer(PyDebugValue value) {}
 }
index 48f0ba741a7da7e10f507fbebab318b84c263c6c..fc3cbd77b55a8dbf131e7175ae6fb2c76c3137b1 100644 (file)
@@ -15,6 +15,13 @@ public class PyFullValueEvaluator extends XFullValueEvaluator {
    * @param debugProcess
    * @param expression
    */
+  protected PyFullValueEvaluator(String linkText, PyFrameAccessor debugProcess, String expression) {
+    super(linkText);
+    myDebugProcess = debugProcess;
+    myExpression = expression;
+  }
+
+
   protected PyFullValueEvaluator(PyFrameAccessor debugProcess, String expression) {
     myDebugProcess = debugProcess;
     myExpression = expression;
@@ -32,9 +39,14 @@ public class PyFullValueEvaluator extends XFullValueEvaluator {
     try {
       final PyDebugValue value = myDebugProcess.evaluate(expression, false, false);
       callback.evaluated(value.getValue());
+      showCustomPopup(myDebugProcess, value);
     }
     catch (PyDebuggerException e) {
       callback.errorOccurred(e.getTracebackError());
     }
   }
+
+  protected void showCustomPopup(PyFrameAccessor debugProcess, PyDebugValue debugValue) {
+
+  }
 }
diff --git a/python/pydevSrc/com/jetbrains/python/debugger/PyNumericContainerValueEvaluator.java b/python/pydevSrc/com/jetbrains/python/debugger/PyNumericContainerValueEvaluator.java
new file mode 100644 (file)
index 0000000..7e3ced6
--- /dev/null
@@ -0,0 +1,18 @@
+package com.jetbrains.python.debugger;
+
+public class PyNumericContainerValueEvaluator extends PyFullValueEvaluator {
+
+  protected PyNumericContainerValueEvaluator(String linkText, PyFrameAccessor debugProcess, String expression) {
+    super(linkText, debugProcess, expression);
+  }
+
+  @Override
+  protected void showCustomPopup(PyFrameAccessor debugProcess, PyDebugValue debugValue) {
+    debugProcess.showNumericContainer(debugValue);
+  }
+
+  @Override
+  public boolean isShowValuePopup() {
+    return false;
+  }
+}
index f16ee5c7987a972e88f08b036ed2b0f214a1a175..2bb3a98e1dc5a8e544fe317411c8a26b7efe2afd 100644 (file)
@@ -65,6 +65,7 @@ import com.jetbrains.python.PythonFileType;
 import com.jetbrains.python.console.PythonConsoleView;
 import com.jetbrains.python.console.PythonDebugLanguageConsoleView;
 import com.jetbrains.python.console.pydev.PydevCompletionVariant;
+import com.jetbrains.python.debugger.containerview.PyViewNumericContainerAction;
 import com.jetbrains.python.debugger.pydev.*;
 import com.jetbrains.python.debugger.settings.PyDebuggerSettings;
 import com.jetbrains.python.psi.*;
@@ -1143,6 +1144,11 @@ public class PyDebugProcess extends XDebugProcess implements IPyDebugProcess, Pr
     return pyType == null ? null : typeToPosition(pyType);
   }
 
+  @Override
+  public void showNumericContainer(PyDebugValue value) {
+    PyViewNumericContainerAction.showNumericViewer(getProject(), value);
+  }
+
   @Nullable
   private static XSourcePosition typeToPosition(PyType pyType) {
     final PyClassType classType = PyUtil.as(pyType, PyClassType.class);
index 17b354c99e67ed3409ce4c3e2b69d2a47c31c54d..e8741778cf31e91d2f5150f180956966b1d1da71 100644 (file)
@@ -40,28 +40,32 @@ public class PyViewNumericContainerAction extends XDebuggerTreeActionBase {
     Project p = e.getProject();
     if (p != null && node != null && node.getValueContainer() instanceof PyDebugValue && node.isComputed()) {
       PyDebugValue debugValue = (PyDebugValue)node.getValueContainer();
-      String nodeType = debugValue.getType();
-      final ViewNumericContainerDialog dialog;
-      if ("ndarray".equals(nodeType)) {
-        dialog = new ViewNumericContainerDialog(p, (dialogWrapper) -> {
-          NumpyArrayTable arrayTable = new NumpyArrayTable(p, dialogWrapper, debugValue);
-          arrayTable.init();
-          return arrayTable.getComponent().getMainPanel();
-        });
-      }
-      else if (("DataFrame".equals(nodeType))) {
-        dialog = new ViewNumericContainerDialog(p, (dialogWrapper) -> {
-          DataFrameTable dataFrameTable = new DataFrameTable(p, dialogWrapper, debugValue);
-          dataFrameTable.init();
-          return dataFrameTable.getComponent().getMainPanel();
-        });
-      }
-      else {
-        throw new IllegalStateException("Cannot render node type: " + nodeType);
-      }
+      showNumericViewer(p, debugValue);
+    }
+  }
 
-      dialog.show();
+  public static void showNumericViewer(Project project, PyDebugValue debugValue) {
+    String nodeType = debugValue.getType();
+    final ViewNumericContainerDialog dialog;
+    if ("ndarray".equals(nodeType)) {
+      dialog = new ViewNumericContainerDialog(project, (dialogWrapper) -> {
+        NumpyArrayTable arrayTable = new NumpyArrayTable(project, dialogWrapper, debugValue);
+        arrayTable.init();
+        return arrayTable.getComponent().getMainPanel();
+      });
+    }
+    else if (("DataFrame".equals(nodeType))) {
+      dialog = new ViewNumericContainerDialog(project, (dialogWrapper) -> {
+        DataFrameTable dataFrameTable = new DataFrameTable(project, dialogWrapper, debugValue);
+        dataFrameTable.init();
+        return dataFrameTable.getComponent().getMainPanel();
+      });
     }
+    else {
+      throw new IllegalStateException("Cannot render node type: " + nodeType);
+    }
+
+    dialog.show();
   }
 
   @Nullable